如何用Pandas重塑含堆叠日期列的Excel气象数据表格
问题分析
你的代码存在两个核心问题:
- 列名不匹配:Excel表头是中文带英文注释(如「气象站名称(Name)」),但代码里用了纯英文列名(
Name、Time),导致Pandas无法正确识别列,数据处理出现异常。 - 原始空值未处理:气象站名称仅在每个站点的第一行填写,后续月份行是空值,未填充的话会导致透视时丢失大部分数据。
解决方案代码
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
相关产品推荐
相关产品推荐

