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

为何Pandas无法按指定起始日期进行周分组?

Pandas周分组不符合预期的原因解析

问题背景

希望按「周日至周六」的周周期对数据分组求和,示例数据从2023-02-12(周日)到2023-02-25(周六),预期用pd.Grouper(freq='W')或pd.Grouper(freq='W-SUN')实现,但只有freq='W-SAT'符合预期:

import pandas as pd

S = pd.Series([1,2,3,70,2,3,4,5,6,10,20,4,9,1],
              pd.DatetimeIndex(['2023-02-%d' % d for d in range(12,26)]))

# 使用W-SUN的结果(不符合预期)
S.groupby(pd.Grouper(freq='W-SUN',origin='start_day')).sum()
# 输出:
# 2023-02-12     1
# 2023-02-19    89
# 2023-02-26    50
# Freq: W-SUN, dtype: int64

# 使用W-SAT的结果(符合预期)
S.groupby(pd.Grouper(freq='W-SAT',origin='start_day')).sum()
# 输出:
# 2023-02-18    85
# 2023-02-25    55
# Freq: W-SAT, dtype: int64

核心原因

Pandas中freq='W-XXX'的规则是以XXX作为一周的结束日期,而非起始日期:

  • W-SUN:一周结束于周日,对应周期为「周一 → 周日」
  • W-SAT:一周结束于周六,对应周期为「周日 → 周六」

这就是为什么W-SAT能得到你想要的分组结果,而W-SUN不行。

具体分组逻辑拆解

  1. W-SUN的分组逻辑:

    • 第一个分组以2023-02-12(周日)为结束日,仅包含当天数据,求和为1
    • 第二个分组以2023-02-19(周日)为结束日,包含2023-02-13(周一)到2023-02-19(周日)的7天数据,求和89
    • 第三个分组以2023-02-26(下一个周日)为结束日,包含2023-02-20(周一)到2023-02-25(周六)的6天数据,求和50
  2. W-SAT的分组逻辑:

    • 第一个分组以2023-02-18(周六)为结束日,包含2023-02-12(周日)到2023-02-18(周六)的7天数据,求和85
    • 第二个分组以2023-02-25(周六)为结束日,包含2023-02-19(周日)到2023-02-25(周六)的7天数据,求和55
      完全匹配「周日至周六」的周期需求。

补充说明

origin='start_day'仅用于让分组起始点对齐数据的第一天,但不会改变freq定义的周结束日规则,核心还是要明确W-XXX代表的是周结束日而非起始日。

内容的提问来源于stack exchange,提问作者Jason S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:12:56