You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:57:50