如何将Pandas月度气候数据重构为按年份分组的格式?
将月度气候数据从长格式转换为宽格式(按年份分组,月份为列)
你之前用merge失败的核心原因是:原DataFrame的Date列是带具体月份的日期(比如2010-01-01和2010-02-01),不同月份的Date值完全不重复,因此merge时找不到匹配行,自然返回空结果或错误。正确思路是先提取年份作为分组依据,再将每个月份的HDD/CDD转为独立列。
以下是可行的解决方案:
步骤1:预处理日期列,提取年份和月份信息
先确保Date列是datetime类型,再拆分出年份和月份缩写(或全称):
import pandas as pd # 假设你的原始DataFrame名为dd dd['Date'] = pd.to_datetime(dd['Date']) dd['Year'] = dd['Date'].dt.year # 提取月份缩写(如Jan、Feb),若想用全称可替换为 dt.month_name() dd['Month'] = dd['Date'].dt.month_abbr
步骤2:用pivot_table重塑数据(推荐)
pivot_table可以直接将长格式转成目标宽格式,同时自动处理同一年/月的重复数据(如需调整聚合逻辑,修改aggfunc参数即可):
# 按年份分组,将月份+指标组合为列 pivoted = dd.pivot_table( index='Year', columns=['Month', dd.columns.difference(['Date', 'Year', 'Month'])], values=['HDD', 'CDD'], aggfunc='first' # 同一年/月仅一条数据时用first即可 ) # 调整列名为"Month-HDD"/"Month-CDD"格式 pivoted.columns = ['-'.join(col) for col in pivoted.columns] # 重置索引,将Year转为列(匹配期望格式的Date列) result = pivoted.reset_index().rename(columns={'Year': 'Date'})
替代方案:melt + unstack
如果更习惯用解构-重组的方式,也可以用melt转成更长格式后再unstack:
# 先将HDD/CDD转为变量-值对 melted = dd.melt( id_vars=['Year', 'Month'], value_vars=['HDD', 'CDD'], var_name='Metric', value_name='Value' ) # 组合月份+指标作为列名,再展开成宽格式 unstacked = melted.set_index(['Year', 'Month', 'Metric'])['Value'].unstack(['Month', 'Metric']) unstacked.columns = ['-'.join(col) for col in unstacked.columns] # 整理成最终格式 result = unstacked.reset_index().rename(columns={'Year': 'Date'})
最终效果
处理后的resultDataFrame将完全匹配你期望的格式:
| Date | Jan-HDD | Jan-CDD | Feb-HDD | Feb-CDD | ... |
|---|---|---|---|---|---|
| 2010 | 3000 | 0 | 2500 | 500 | ... |
| 2011 | 3000 | 0 | 1500 | 500 | ... |
内容的提问来源于stack exchange,提问作者AeglosGreenleaf
相关产品推荐
相关产品推荐

