Pandas中W-DAY、W-SUN等频率行为为何混淆且不一致?
为什么
W-SUN频率在date_range和to_period().to_timestamp()中行为不一致? 这个困惑其实源于pandas对周频率周期的起始/结束锚点处理逻辑不同,我来拆解清楚:
1. pd.date_range(freq='W-SUN')的行为
当你用freq='W-SUN'调用date_range时,它生成的是每周日的日期序列——因为W-SUN的定义就是“以周日作为每周周期的结束日”,date_range会自动从起始日期之后的第一个周日开始,按周生成结束日序列。比如你的例子中,2019-07-09是周二,所以第一个生成的日期是2019-07-14(该周的周日),之后每周日依次向后。
2. to_period('W-SUN').to_timestamp()的默认行为
- 第一步
to_period('W-SUN'):会把输入日期归属到以周日为结束日的周周期中,比如2019-07-09(周二)属于“2019-07-08至2019-07-14”这个周周期(周期的label是结束日2019-07-14)。 - 第二步
to_timestamp():默认会返回这个周周期的起始时间,也就是周一(2019-07-08)——这就是你得到周一的原因!
解决方案:让两者行为对齐
如果你想让to_period().to_timestamp()的结果和date_range生成的周日序列一致,只需要给to_timestamp()加上how='end'参数,指定返回周期的结束日:
import pandas as pd # 原代码得到周一 idx = pd.Index([pd.Timestamp('2019-07-09')]) print(idx.to_period('W-SUN').to_timestamp()) # 输出: DatetimeIndex(['2019-07-08'], dtype='datetime64[ns]', freq=None) # 指定how='end'得到周日,和date_range对齐 print(idx.to_period('W-SUN').to_timestamp(how='end')) # 输出: DatetimeIndex(['2019-07-14'], dtype='datetime64[ns]', freq=None)
这个逻辑适用于所有W-DAY类频率:比如W-MON(周一为周期结束日),to_timestamp(how='end')会返回周一,和date_range(freq='W-MON')的结果对齐。
内容的提问来源于stack exchange,提问作者rlms
相关产品推荐
相关产品推荐

