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"
时无效。
答案 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')
请注意,所选时间段的起点跳到中间,但逻辑保持一致。