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
相关产品推荐
相关产品推荐

