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

