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

如何用Pandas重塑含堆叠日期列的Excel气象数据表格

问题分析

你的代码存在两个核心问题:

  1. 列名不匹配:Excel表头是中文带英文注释(如「气象站名称(Name)」),但代码里用了纯英文列名(Name、Time),导致Pandas无法正确识别列,数据处理出现异常。
  2. 原始空值未处理:气象站名称仅在每个站点的第一行填写,后续月份行是空值,未填充的话会导致透视时丢失大部分数据。
解决方案代码
import pandas as pd

# 读入Excel文件
df = pd.read_excel('input.xlsx')

# 重命名列(简化后续代码,若Excel列名本身是英文可跳过此步)
df.rename(columns={
    '气象站名称(Name)': 'Name',
    '时间(Time)': 'Time',
    '最低气温(Minimum)': 'Minimum',
    '最高气温(Maximum)': 'Maximum'
}, inplace=True)

# 填充气象站名称空值:将上一行的站点名称向下填充至空行
df['Name'] = df['Name'].ffill()

# 执行透视:以时间为索引,站点为列,提取气温数据
result = df.pivot(index='Time', columns='Name', values=['Minimum', 'Maximum'])

# 调整列顺序:按站点分组,每个站点先显示最低气温,再显示最高气温
stations = df['Name'].unique()
new_columns = []
for station in stations:
    new_columns.append(('Minimum', station))
    new_columns.append(('Maximum', station))
result = result.reindex(columns=new_columns)

# 格式化表头为目标样式
result.columns = [f'{"最低气温" if col[0] == "Minimum" else "最高气温"} - {col[1]}' for col in result.columns]

# 修改索引列为目标名称
result.index.name = '日期(Date)'

# 输出到Excel
result.to_excel('output.xlsx')
关键步骤说明
  • 列名重命名:将中文列名转为英文简化代码,若Excel列名本身是英文可直接跳过此步。
  • 空值填充(ffill):用ffill()把上一行的站点名称向下填充到空行,确保每个月份数据都关联到正确的气象站。
  • 列顺序调整:手动构建「站点+最低气温+最高气温」的列顺序,匹配你需要的输出格式。
  • 表头格式化:将多级列名合并为「气温类型 - 站点名称」的样式,同时修改索引名为「日期(Date)」。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:25:23