为什么W-DAY在熊猫中表现混乱?

时间:2019-07-09 14:10:09

标签: python pandas datetime

freq = "W-SUN"等的行为似乎令人困惑且不一致。例如,d.date_range(pd.Timestamp('2019-07-09'), pd.Timestamp('2019-11-11'), freq='W-SUN')产生一个星期天序列,而pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SUN').to_timestamp()产生一个星期一。这是怎么回事?

之所以出现这种情况,是因为我有一个日期索引,我想将其四舍五入到某个频率,同时还要生成一个具有相同频率和相位的date_range。似乎index.to_period(freq).to_timestamp()pd.date_range(start, end, freq=freq)可以解决此问题,但是当freq为"W-DAY"时无效。

1 个答案:

答案 0 :(得分:2)

这有点违反直觉,但这是逻辑。当您使用.to_period()时,Pandas会计算您提供的日期所落在的时间段。熊猫计算该时间段的方式是找到与您指定的频率匹配的第二天,然后将时间段向后扩展以包括您选择的日期。换句话说,时间段是结束日期,而不是开始日期

要查找给定星期二的星期日固定周,它会在该星期二之后找到下一个星期日,并添加前六天。但是,当您转换为时间戳时,它将选择该时间段的第一天,在这种情况下,它将是星期一。如果您要求指定星期日的星期日固定期限,它将为您提供这一天以及前六天,而不是后六天。

如果您希望周期开始而不是在一周的特定日期结束,则只需将频率字符串设置为前一天即可。就您而言,pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SAT').to_timestamp()应该可以解决问题。


一些希望会有所帮助的演示

pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SUN')给出:

PeriodIndex(['2019-07-08/2019-07-14'], dtype='period[W-SUN]', freq='W-SUN

请注意,这段时间结束于一个星期日。当您运行pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SUN').to_timestamp()时,它会为您提供这段时间的第一天:

DatetimeIndex(['2019-07-08'], dtype='datetime64[ns]', freq=None)

您可以通过运行以下命令查看日期:

for f in ['W-SUN', 'W-MON', 'W-TUE', 'W-WED', 'W-THU', 'W-FRI', 'W-SAT']:
    print(f, pd.Index([pd.Timestamp('2019-07-09')]).to_period(f))

哪个给:

PeriodIndex(['2019-07-08/2019-07-14'], dtype='period[W-SUN]', freq='W-SUN')
PeriodIndex(['2019-07-09/2019-07-15'], dtype='period[W-MON]', freq='W-MON')
PeriodIndex(['2019-07-03/2019-07-09'], dtype='period[W-TUE]', freq='W-TUE')
PeriodIndex(['2019-07-04/2019-07-10'], dtype='period[W-WED]', freq='W-WED')
PeriodIndex(['2019-07-05/2019-07-11'], dtype='period[W-THU]', freq='W-THU')
PeriodIndex(['2019-07-06/2019-07-12'], dtype='period[W-FRI]', freq='W-FRI')
PeriodIndex(['2019-07-07/2019-07-13'], dtype='period[W-SAT]', freq='W-SAT')

请注意,所选时间段的起点跳到中间,但逻辑保持一致。