
本文详解如何使用 Pandas 将时间序列列按自然季度(Q1/Q2/Q3)自动分组求和,并将季度小计列精准插入原始数据表中,保持列顺序正确、格式统一(如 Q1'24),兼容最新版 pandas(≥2.1.4)。
本文详解如何使用 pandas 将时间序列列按自然季度(q1/q2/q3)自动分组求和,并将季度小计列精准插入原始数据表中,保持列顺序正确、格式统一(如 `q1'24`),兼容最新版 pandas(≥2.1.4)。
在数据分析中,常需将月度数据聚合为季度小计(Subtotal),并以“原列 + 对应季度列”交替形式展示(如:2024-03-01 → Q1'24,2024-04-01/2024-05-01/2024-06-01 → Q2'24)。Pandas 提供了简洁高效的向量化方案,核心在于利用 DatetimeIndex.to_period('Q') 进行季度对齐与分组聚合。
✅ 推荐实现(适配 pandas ≥2.1.4)
import pandas as pd
# 假设 df 是您的原始 DataFrame(part 为索引,日期字符串为列名)
df.columns = pd.to_datetime(df.columns) # 将列名转为 datetime 类型
df_t = df.T # 转置:使日期成为索引,便于按季度分组
# 按季度分组求和,得到季度小计 Series(索引为 Period,值为各 part 的季度和)
quarter_sums = df_t.groupby(df_t.index.to_period('Q')).sum().T
# 合并原始数据与季度小计(concat 沿列 axis=1)
out = pd.concat([df, quarter_sums], axis=1)
# 关键:按季度逻辑排序列(Q1'24, 2024-03-01, 2024-04-01, ..., Q2'24, ...)
# 使用 PeriodIndex 排序确保 Q1 < Q2 < Q3,且原日期列按时间先后嵌入对应季度后
out = out.sort_index(
axis=1,
key=lambda x: pd.PeriodIndex(
[col if isinstance(col, pd.Period) else pd.to_datetime(col) for col in x],
freq='Q'
)
)
# 格式化列名:Period 列 → 'Q1'24',datetime 列保持原样
out.columns = [
col.strftime("Q%q'%y") if isinstance(col, pd.Period) else col
for col in out.columns
]? 输出效果说明
- 每个季度小计列(如 Q1'24)紧邻其覆盖的第一个月份列(2024-03-01),符合示例中的布局;
- Q1'24 仅包含 2024-03-01(因 3 月属 Q1),而 Q2'24 包含 2024-04/05/06 三列之和;
- 列顺序严格按时间逻辑排列:2024-03-01 → Q1'24 → 2024-04-01 → 2024-05-01 → 2024-06-01 → Q2'24 → ...。
⚠️ 注意事项
- 列名必须可解析为日期:确保原始列名为标准日期字符串(如 '2024-03-01'),否则 pd.to_datetime() 会报错;
- 避免重复列名:若原始数据已存在 Q1'24 等列,concat 可能引发冲突,建议先检查 df.columns;
- 性能提示:对超大宽表(>1000 列),sort_index(..., key=...) 效率优于手动构建排序列表;
- 扩展性:如需年度小计,将 'Q' 替换为 'Y',格式化改为 col.strftime("FY%y") 即可。
此方法完全向量化、无循环,代码简洁鲁棒,是生产环境中处理时间维度小计的标准实践。

















