如何将带日期索引的pandas DataFrame转为年份为索引、月份为列的汇总表
pandas 日期表转换实现方案
基于你现有代码的后续补充方案
你已经完成了月度聚合操作后,只需要从聚合结果的时间索引中提取年份、月份信息,再做一次维度转换即可,完整可运行代码如下:
# 你已有的代码片段 import pandas as pd df=pd.DataFrame([ {'data_date': '2016-01-01', 'value': 1}, {'data_date': '2016-01-02', 'value': 2}, {'data_date': '2017-02-05', 'value': 3}, {'data_date': '2017-02-07', 'value': 4}, {'data_date': '2017-03-09', 'value': 5}]) df['data_date'] = pd.to_datetime(df['data_date']) df.set_index('data_date', inplace=True) grp_df = df.groupby([pd.Grouper(freq='M')]).sum() # 新增维度转换代码 # 提取年份、月份缩写信息 grp_df['year'] = grp_df.index.year grp_df['month'] = grp_df.index.strftime('%b') # 生成以年为索引、月为列的结果表 result = grp_df.pivot(index='year', columns='month', values='value') # 调整列顺序为1-12月自然排序,无数据默认填充为0,可替换为你需要的`xx`占位符 month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] result = result.reindex(columns=month_order, fill_value=0)
更简洁的一步到位实现方案
不需要提前做月度聚合,直接从原始数据提取时间维度拆分后分组展开即可:
import pandas as pd df=pd.DataFrame([ {'data_date': '2016-01-01', 'value': 1}, {'data_date': '2016-01-02', 'value': 2}, {'data_date': '2017-02-05', 'value': 3}, {'data_date': '2017-02-07', 'value': 4}, {'data_date': '2017-03-09', 'value': 5}]) df['data_date'] = pd.to_datetime(df['data_date']) # 直接提取年、月维度后聚合展开 df['year'] = df['data_date'].dt.year df['month'] = df['data_date'].dt.strftime('%b') result = df.groupby(['year', 'month'])['value'].sum().unstack(fill_value=0) # 调整月份列按1-12月排序 month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] result = result.reindex(columns=month_order, fill_value=0)
运行后得到的result表完全符合你的预期格式,你可以直接打印查看输出效果。
内容的提问来源于stack exchange,提问作者Shubham Periwal
相关产品推荐
相关产品推荐

