Pandas的日期范围从结束日期到开始日期

2024-04-26 20:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

在am中尝试使用Python生成一系列半年一次的日期。Pandas提供了一个函数^{}来帮助解决这个问题,但是我希望我的日期范围从结束日期开始并向后迭代。在

例如给定输入:

start = datetime.datetime(2016 ,2, 8)
end = datetime.datetime(2018 , 6, 1)
pd.date_range(start, end, freq='6m')

结果是:

^{pr2}$

如何生成以下内容:

DatetimeIndex(['2016-02-08', '2016-06-01', '2016-12-01', '2017-06-01',
               '2017-12-01', '2018-06-01'])

Tags: 函数pandasdatetimedaterangeamstartend
2条回答

通过更新的输出(来自您所做的编辑),您可以执行以下操作:

from pandas.tseries.offsets import DateOffset

end = datetime.datetime(2018 , 6, 1)
start = datetime.datetime(2016 ,2, 8)
#Get the range of months to cover
months = (end.year - start.year)*12 + end.month - start.month
#The frequency of periods
period = 6 # in months

pd.DatetimeIndex([end - DateOffset(months=e) for e in range(0, months, period)][::-1]).insert(0, start)

这是一个相当简洁的解决方案,虽然我没有比较运行时,所以我不确定它有多快。在

基本上,这只是创建一个列表所需的日期,然后将其转换为日期时间索引。在

这可以在没有熊猫的情况下完成,而是使用datutil。然而,它涉及的范围可能比它应该做的更多:

from datetime import date
import math
from dateutil.relativedelta import relativedelta

#set up key dates
start = date(2016 ,2, 8)
end = date(2018 , 6, 1)

#calculate date range and number of 6 month periods
daterange = end-start
periods = daterange.days *2//365

#calculate next date in sequence and check for year roll-over
next_date = date(start.year,math.ceil(start.month/6)*6,1)
if next_date < start: next_date = date(next_date.year+1,next_date.month,1)

#add the first two values to a list
arr = [start.isoformat(),next_date.isoformat()]

#calculate all subsequent dates using 'relativedelta'
for i in range(periods):
    next_date = next_date+ relativedelta(months=+6)
    arr.append(next_date.isoformat())


#display results
print(arr)

相关问题 更多 >