在Python中存储没有年份的日期和月份

Posted

技术标签:

【中文标题】在Python中存储没有年份的日期和月份【英文标题】:Storing day and month without year in Python 【发布时间】:2017-06-07 11:42:23 【问题描述】:

我只需要存储没有年份值的月份和日期(生日)。

在查看 pandas 的文档时(主要是因为它具有有用的时间操纵功能),特别是 Periods,它指出您需要传入时间跨度和频率。我不太确定如何使用频率部分来解决我的问题。什么频率最合适?使用 pd 是不是最好的方法?

谢谢!

【问题讨论】:

显示示例数据和预期结果。你有它作为日期时间还是字符串?如果作为字符串,则使用切片即。 "23.01.2017"[:5],如果是日期时间,则使用 strftime 格式化为字符串。 【参考方案1】:

我相信您是在问是否有没有指定年份的日期时间这样的对象。好像没有。 Period 对象总是指定年份:使用它们不会节省内存。

t=pd.Period('03-04',freq='D')
t.year==1
t.month==3
t.day==4

您应该使用 dateTime 对象并忽略它们所在的年份。唯一的障碍是闰年。对于初学者,您可以选择距任何闰年 2 年的年份,或参考 Timestamps.isocalender 值,使用类似的策略选择起始年份,使您的年份距最近的 12 年有 53 周(isocalendar 有一个固定的精确 52周,每 24 年有 53 周(7 天/周 * 4 年/addLeapDay)。

TDate15.Date=[d.replace(year=1904) for d in TDate15.Date]#   
TDate15=TDate15.groupby('Date').agg('Data_Value':['min','max'])
#vs
TDate15=TDate15.groupby([d2015.Date.dt.month,d2015.Date.dt.day]).agg('Data_Value':['min','max'])
#if you use a reference year as in the first exemple, you get an index of Datetime.
#vs
#using directly groupby day & month, you might need to convert to datetime further, wich would looked at least like:
#TDate15.index=[pd.to_datetime(d,m) for m,d in TDate15.index]
#However I had to do: 
i=list(zip(TDate15.index.labels[0],TDate15.index.labels[1]))
x=[pd.to_datetime( str(TDate05.index.levels[0][m]) + '-' + str(TDate05.index.levels[1][d]) +'-' + '1904',
                format='%m-%d-%Y') \
  for m,d in i]

我看到的完整解决方案是通过使其始终回到相同的非闰年来调整日期时间类。 对于合并或分组,strftime 一次性完成这项工作。输出是字符串,因此对于多个 manip,您需要来回转换字符串日期时间。 我希望您不会因为“年份”而对使用的内存空间有真正的问题。

【讨论】:

【参考方案2】:

这不是Period 的工作方式。它们代表特定的时间段。类似于Timestamp 表示特定时间点的方式。

您似乎想要一个通用的Month-Day 标签。您可以使用strftime 获取字符串,但您将丢失任何日期操作。

考虑带有时间戳索引的一系列时间戳。

s = pd.date_range('2011-01-31', periods=12, freq='M').to_series()
s

2011-01-31   2011-01-31
2011-02-28   2011-02-28
2011-03-31   2011-03-31
2011-04-30   2011-04-30
2011-05-31   2011-05-31
2011-06-30   2011-06-30
2011-07-31   2011-07-31
2011-08-31   2011-08-31
2011-09-30   2011-09-30
2011-10-31   2011-10-31
2011-11-30   2011-11-30
2011-12-31   2011-12-31
Freq: M, dtype: datetime64[ns]

你可以像这样得到月份和日期 (see this site for a summary of strftime)

s.dt.strftime('%m-%d')

2011-01-31    01-31
2011-02-28    02-28
2011-03-31    03-31
2011-04-30    04-30
2011-05-31    05-31
2011-06-30    06-30
2011-07-31    07-31
2011-08-31    08-31
2011-09-30    09-30
2011-10-31    10-31
2011-11-30    11-30
2011-12-31    12-31
Freq: M, dtype: object

【讨论】:

以上是关于在Python中存储没有年份的日期和月份的主要内容,如果未能解决你的问题,请参考以下文章

如果信用卡的有效期只包含月份和年份,我该如何存储它?

需要从redshift中的日期列中划分月份和年份

SQL Server 2005获取任何年份中任何月份的第一个和最后一个日期

Python中的日期时间当前年份和月份

如何获取有关月份和年份的数据

Bootstrap 日期选择器显示月份和年份菜单