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

如何将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将完全匹配你期望的格式:

DateJan-HDDJan-CDDFeb-HDDFeb-CDD...
2010300002500500...
2011300001500500...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:13:15