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

如何用Pandas将Datetime按年份和季度分组到单个索引列?

解决按年/季度分组后多层索引导致的时间序列绘图问题

我明白你的问题啦——用year和quarter分组后得到的**多层索引(MultiIndex)**确实会给时间序列绘图添乱,因为绘图工具没法把两个独立的索引列当成连续的时间轴来处理。这里有两种简单的解决方案,帮你把索引转成能直接用于绘图的时间格式:

方法一:直接按季度周期(Period)分组(推荐)

这种方法一步到位,直接把日期索引转换成季度周期类型,分组后得到的索引是单个的时间周期,完全兼容pandas的时间序列绘图功能。

修改后的示例代码:

import pandas as pd

df0 = pd.DataFrame({
    'date':['2016-1-1', '2016-4-1', '2016-7-1', '2016-10-1', 
            '2017-1-1', '2017-4-1', '2017-7-1', '2017-10-1'], 
    'value':[32141,1234,2134,2134,1234,2134,213,1234]
})
df0['date'] = pd.to_datetime(df0['date'], format="%Y-%m-%d")
df0.index = df0['date']

# 关键修改:用to_period('Q')生成季度周期索引,直接按这个分组
df0 = df0.groupby(df0.index.to_period('Q')).sum()
print(df0)

# 现在可以正常绘制时间序列图了
# df0['value'].plot()

运行后得到的索引是类似2016Q1、2016Q2的季度周期,pandas能自动识别其时间顺序,绘图时不会出错。

方法二:将已有的多层索引转换为Datetime索引

如果已经按year和quarter完成分组,或者你需要保留这两个维度的信息,可以把多层索引转换成单个的Datetime索引,比如取每个季度的第一天作为代表日期:

示例代码:

import pandas as pd

df0 = pd.DataFrame({
    'date':['2016-1-1', '2016-4-1', '2016-7-1', '2016-10-1', 
            '2017-1-1', '2017-4-1', '2017-7-1', '2017-10-1'], 
    'value':[32141,1234,2134,2134,1234,2134,213,1234]
})
df0['date'] = pd.to_datetime(df0['date'], format="%Y-%m-%d")
df0.index = df0['date']

# 保留你原来的分组方式
df0 = df0.groupby(by=[df0.index.year, df0.index.quarter]).sum()

# 把(year, quarter)的多层索引转换成季度起始日期的Datetime索引
df0.index = pd.to_datetime([f"{y}-{q*3-2}-1" for y, q in df0.index])
print(df0)

# 现在可以正常绘图
# df0['value'].plot()

这种方法通过列表推导式,把每个(year, quarter)组合转换成对应的季度第一天(比如2016年第1季度对应2016-01-01),生成连续的时间戳索引,完美适配时间序列绘图需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:44