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

如何从自定义月份开始按年度分组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))

结果说明

运行后会得到三个分组:

  1. 1999-07-01 至 2000-06-30 的数据量
  2. 2000-07-01 至 2001-06-30 的数据量
  3. 2001-07-01 至 2001-12-31 的数据量

完全符合从7月1日开始的12自然月周期分组需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:17:31