为何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不行。
具体分组逻辑拆解
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
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
相关产品推荐
相关产品推荐

