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')