如何创建一个以年为频率的pandas DatetimeIndex?

33
使用 pandas.date_range(startdate, periods=n, freq=f) 函数,您可以创建一系列 pandas 的 Timestamp 对象,其中 freq 可选参数表示范围内的频率(秒、分钟、小时、天...)。 文档 没有提到应该传递哪些文字,但是经过几分钟的搜索,您可以很容易地找到大部分文字。
  • 's':秒
  • 'min':分钟
  • 'H':小时
  • 'D':日
  • 'w':周
  • 'm':月
然而,'y'、'Y'、'yr' 等都不会创建具有年份频率的日期。有人知道要传入什么,或者是否可能吗?
4个回答

56

年度索引到年初或年末

freq='A'表示年末频率,'AS'表示年初。请在文档中查看别名

例如: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)

从任意月份开始的年度索引

如果您需要从特定时间开始每年进行索引,请使用锚定偏移量,例如: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 =无)

这是一个日期时间索引的示例,其中包含四个日期(2000年9月10日,2001年9月10日,2002年9月10日和2003年9月10日)。它们的数据类型为datetime64(纳秒),并且按照一年为频率进行偏移。在这种情况下,使用了DateOffset对象来指定间隔为一年,并且时区未指定。

2
谢谢,我想知道为什么date_range()的文档页面没有链接到这个页面,如果有的话就不用发这个问题了。 - imrek
能否使用自定义日期,例如8月1日? - imrek
谢谢,至少适用于某月的第一天。 - imrek
我感觉现在只是在重写文档,但我已经更新到一个任意的日期了。 - jmz
如何获得自定义月份的最后一个工作日呢?我有 df1 = df1.set_index(pd.date_range(start=pd.datetime(1984,1,1),end=pd.datetime(2015,1,1), freq='A-JUN'),但是我想要六月份的最后一个工作日。 - Jonathan Epstein
请注意,pd.date_range接受可转换为日期的字符串(任何可以从pd.Timestamp构造的东西都可以),您可以使用start='2001-8-1'表示开始日期为2001年8月1日。 - BallpointBen

5

有了所有这些黑客,有一条明确的路:

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

A:每年一次。

365D? 真的吗?那么闰年怎么办?


1
您可以使用月份,然后选择每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,但如果您有特定的开始日期,则也可以使用它。 - rofls

0

您可以使用多个频率字符串。例如:

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

这段代码将会给你一个序列,包括01/01/2010、01/01/2011等等,我想这正是你所需要的。当然,问题在于你可能会遇到闰年的问题。

2
我曾尝试将“12m”作为12个月的参数传入,但那是不正确的。例如,第一个日期是2015年1月1日,下一个日期应该是2016年1月31日。而365天也不准确,因为还有闰年的问题。 - imrek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接