如何解决Python:pd.date_range,返回值不一致
您好,我可以向我解释为什么Python的行为方式如下:
import pandas as pd
sdate = pd.to_datetime('2020-01-31')
date_range = pd.date_range(start = sdate + pd.DateOffset(months=-3),end = sdate + pd.DateOffset(months=-1),freq = 'M')
上面的date_range对象返回:
DatetimeIndex(['2019-10-31','2019-11-30','2019-12-31'],dtype='datetime64[ns]',freq='M')
然后,如果我按照以下说明提前一个月:
sdate = pd.to_datetime('2020-02-29')
date_range = pd.date_range(start = sdate + pd.DateOffset(months=-3),freq = 'M')
上面的date_range对象现在返回:
DatetimeIndex(['2019-11-30',freq='M')
为什么第二个实例只返回两个日期而前三个日期呢?
谢谢
解决方法
这是一个有趣的发现,罪魁祸首是freq = 'M'
,它是“月末频率”。
问题
问题主要是freq = 'M'
仅显示您所拥有的时段内每个月的最后天,因此对于第一种情况,我们拥有
sdate = pd.to_datetime('2020-01-31')
date_range = pd.date_range(start = sdate + pd.DateOffset(months=-3),end = sdate + pd.DateOffset(months=-1),freq = 'M')
其评估结果
start = '2019-10-31'
end = '2019-12-31'
因此,这些日期(含)之间的范围是
['2019-10-31','2019-11-30','2019-12-31']
现在第二种情况
sdate = pd.to_datetime('2020-02-29')
date_range = pd.date_range(start = sdate + pd.DateOffset(months=-3),freq = 'M')
这将评估为
start = '2019-11-29'
end = '2020-01-29'
所以该月的最后几天是['2019-11-30','2019-12-31']
,因为该范围以2020-01-29
结尾,所以2020-01-31
不包含在该范围内。
解决方案
..这取决于您要实现的目标,但是如果您的日期范围是每月一次并且您不关心日期,那么可以考虑使用MonthEnd作为
import pandas as pd
from pandas.tseries.offsets import MonthEnd
sdate = pd.to_datetime('2020-02-29')
date_range = pd.date_range(start = sdate + pd.DateOffset(months=-3) + MonthEnd(0),end = sdate + pd.DateOffset(months=-1) + MonthEnd(0),freq = 'M')
这会给你
DatetimeIndex(['2019-11-30','2019-12-31','2020-01-31'],dtype='datetime64[ns]',freq='M')
,
date_range 有一个 period 参数。更容易计算开始日期,将频率设置为月份,以及 3. 开始日期可以是一个月中的任何一天。 date_range 返回时间间隔。
sdate=pd.Timestamp('2019-10-01')
index=pd.date_range(start=sdate,periods=3,freq='M')
print(index)
输出:
DatetimeIndex(['2019-10-31','2019-12-31'],freq='M')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。