如何以年份为频率创建熊猫 DatetimeIndex?

Posted

技术标签:

【中文标题】如何以年份为频率创建熊猫 DatetimeIndex?【英文标题】:How to create a pandas DatetimeIndex with year as frequency? 【发布时间】:2015-11-17 01:58:53 【问题描述】:

使用pandas.date_range(startdate, periods=n, freq=f) 函数,您可以创建一系列pandas Timestamp 对象,其中freq 可选参数表示该范围内的频率(秒、分、小时、日...)。

documentation 没有提到预期传入的字面量,但几分钟后你可以轻松找到大部分。

's' : 第二个 'min' : 分钟 'H':小时 'D':天 'w' : 周 'm' : 月

但是,“y”、“Y”、“yr”等都不会创建以年份为频率的日期。 有谁知道要传递什么,或者是否有可能?

【问题讨论】:

【参考方案1】:

您可以对频率字符串使用倍数。例如:

pd.date_range('01/01/2010',periods=10,freq='365D')

此代码将为您提供 2010 年 1 月 1 日、2011 年 1 月 1 日等的系列,我认为这是您正在寻找的。当然,这里的问题是你会遇到闰年的问题。

【讨论】:

我实际上已经尝试通过 '12m' 12 个月,但这是不对的,例如第一个日期是 2015-01-01,下一个日期是 2016-01-31。 365 也不对,闰年。【参考方案2】:

您可以使用月份,然后每 12 个月选择一次:

months=pandas.date_range(start=datetime.datetime.now(),periods=120,freq='M')
year=[months[11*i] for i in range(12)]

你也可以这样做:

usingDays=pandas.date_range(start=datetime.datetime.now(),periods=10,freq='365D')

但这在闰年时效果不佳。

【讨论】:

要使上述方法起作用,您必须import datetime 但如果您有一个特定的开始日期,那么您也可以使用它。【参考方案3】:

到年初或年底的年度索引

频率是 freq='A' 表示年末频率,'AS' 表示年初。检查aliases in the documentation。

例如。 pd.date_range(start=pd.datetime(2000, 1, 1), periods=4, freq='A')

返回

DatetimeIndex(['2000-12-31', '2001-12-31', '2002-12-31', '2003-12-31'], dtype='datetime64[ns]', freq='A-DEC', tz=None)

任意月份开始的年度索引

如果您需要从特定时间开始每年一次,请使用anchored offset, 例如。 pd.date_range(start=pd.datetime(2000, 1, 1), periods=10, freq='AS-AUG')

返回

DatetimeIndex(['2000-08-01', '2001-08-01', '2002-08-01', '2003-08-01'], dtype='datetime64[ns]', freq='AS-AUG', tz=None)

从任意日期开始的年度索引

要从任意日期开始索引,请在该日期开始系列并使用自定义 DateOffset 对象。

例如。 pd.date_range(start=pd.datetime(2000, 9, 10), periods=4, freq=pd.DateOffset(years=1))

返回

DatetimeIndex(['2000-09-10', '2001-09-10', '2002-09-10', '2003-09-10'], dtype='datetime64[ns]', freq='<DateOffset: kwds='years': 1>', tz=None)

【讨论】:

谢谢,我想知道为什么date_range() 的文档页面没有链接到这个页面,我不会发布这个问题。 是否可以使用自定义日期,例如 8 月 1 日? 谢谢,至少在某个月的第一天有效。 我觉得我现在只是在重写文档,但我已经更新了任意日期。 您如何获得自定义月份的最后一个工作日?我有df1 = df1.set_index(pd.date_range(start=pd.datetime(1984,1,1),end=pd.datetime(2015,1,1), freq='A-JUN')' 但想要六月的最后一个工作日【参考方案4】:

有了所有这些技巧,有一个明确的方法:

pd.date_range(start=datetime.datetime.now(),periods=5,freq='A')

A:每年一次。

365D?真的吗? leap years呢?

【讨论】:

以上是关于如何以年份为频率创建熊猫 DatetimeIndex?的主要内容,如果未能解决你的问题,请参考以下文章

在数据框中编辑日期以在熊猫中显示年份

给定一个代表值频率的熊猫系列,我如何将这些频率转换为百分比?

如何使用熊猫在年份变化时继续周数

如何从熊猫数据框中提取日期/年份/月份?

熊猫将带有年份整数的列转换为日期时间

熊猫过滤具有特定年份的数据框行