如何从自定义月份开始按年度分组Pandas DataFrame?
Pandas按自定义起始月(7月1日)进行年度分组的问题解决
问题说明
使用pd.Grouper按7D(7天)频率分组时,指定origin参数可以正常按自定义起始日期分组,但切换到12MS或1Y这类年度频率、并设置origin=1999-07-01时,分组逻辑失效。
核心原因
12MS/1Y属于年度周期频率,pandas对这类频率默认使用1月1日作为年度锚点,origin参数无法覆盖这种绑定到月份的周期起始规则,导致自定义起始日期不生效。
解决方案
直接使用指定起始月份的年度频率,不需要依赖origin参数,两种可行方式:
方法1:使用内置频率字符串AS-JUL
AS-JUL是pandas内置的频率标识,代表「年度起始于7月」,直接作为freq参数传入pd.Grouper即可。
方法2:使用pd.offsets.YearBegin指定起始月
通过pd.offsets.YearBegin(month=7)手动定义年度周期的起始月份为7月,灵活性更高。
修正后的测试代码
import pandas as pd import numpy as np # 生成测试数据:2000-01-01 到 2001-12-31的小时级时间序列 start, end = '2000-01-01 00:00:00', '2001-12-31 23:00:00' rng = pd.date_range(start, end, freq='1H') ts = pd.Series(np.ones(len(rng)), index=rng) # 方法1:使用AS-JUL频率分组 grouper = pd.Grouper(freq="AS-JUL") grouped = ts.groupby(grouper) print("方法1分组结果:") print(grouped.apply(len)) # 方法2:使用YearBegin偏移量分组 grouper = pd.Grouper(freq=pd.offsets.YearBegin(month=7)) grouped = ts.groupby(grouper) print("\n方法2分组结果:") print(grouped.apply(len))
结果说明
运行后会得到三个分组:
- 1999-07-01 至 2000-06-30 的数据量
- 2000-07-01 至 2001-06-30 的数据量
- 2001-07-01 至 2001-12-31 的数据量
完全符合从7月1日开始的12自然月周期分组需求。
内容的提问来源于stack exchange,提问作者yvTly38Wtn
相关产品推荐
相关产品推荐

