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

Pandas使用pd.Grouper按自定义频率分组获取索引组输出不符预期怎么办

问题解答

1. pd.Grouper分组结果数值含义

你看到的groups字典里的299、9059这类数值,是pandas对连续时间索引分组的优化存储结果:由于你的时间索引是连续无缺失的小时级序列,每个分组的索引对应原始DataFrame的连续整数位置切片,pandas会用slice(起始位置, 结束位置)代替存储完整的索引列表,打印时展示的就是切片的结束位置,数值上等于截止到该分组的累计总行数。比如299就是2018年分组的总行数,2019年分组的总行数为9059-299=8760,和全年小时数完全吻合。
你可以直接将值转成列表,就能看到该分组包含的所有时间索引:

# 打印2018年分组的所有时间索引
print(list(auctions.groupby(pd.Grouper(freq="Y")).groups.values())[0])

2. 对齐index.year分组格式的方法

pd.Grouper(freq="Y")的默认分组键是时间区间的结束时间戳(比如2018年分组键为2018-12-31),你只需要对分组键做简单转换就能得到和index.year一致的格式:

year_groups = auctions.groupby(pd.Grouper(freq="Y")).groups
# 转换键为年份整数,值保持为对应时间索引列表
formatted_year_groups = {k.year: list(v) for k, v in year_groups.items()}

转换后输出和auctions.groupby(auctions.index.year).groups的结果完全一致。

3. 按半年分组的实现

按半年间隔分组只需要将freq参数调整为6M,再做对应格式化即可:

# 按每6个月为一个区间分组,分组键为区间结束时间戳
half_year_groups = auctions.groupby(pd.Grouper(freq="6M")).groups
# 格式化键为 年份+上下半年 标识,值为对应时间索引列表
formatted_half_year = {}
for ts, idx_list in half_year_groups.items():
    half_tag = "H1" if ts.month <= 6 else "H2"
    formatted_half_year[f"{ts.year}{half_tag}"] = list(idx_list)

最终得到的formatted_half_year的键为2018H2、2019H1这类自定义半年标识,值为该半年区间包含的所有时间索引列表,符合你的使用需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:04