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

如何用Pandas实现列转行并保留数据值(含时间维度转换)

解决Pandas表格结构转换问题

步骤拆解

要实现目标结构,核心是先宽表转长表拆分小时列,再长表转宽表将Variable转为列名,具体分四步:

  1. 拆分小时列:用melt把H01-H24的宽格式转为长格式,保留date、Variable、station_code作为标识列,把小时列名和对应值拆成两列。
  2. 生成datetime列:从小时列名中提取小时数,和date组合成完整的datetime格式。
  3. 重塑表格结构:用pivot将Variable的取值转为列名,对应填充小时值,同时保留station_code。
  4. 整理最终结构:重置索引,让datetime和station_code回到列的位置。

代码实现

假设原始DataFrame名为df,具体代码如下:

import pandas as pd

# 1. 宽表转长表,拆分小时列
melted_df = df.melt(
    id_vars=['date', 'Variable', 'station_code'],
    value_vars=[f'H{i:02d}' for i in range(1, 25)],  # 自动生成H01到H24列名
    var_name='hour_label',
    value_name='variable_value'
)

# 2. 提取小时数并生成datetime列
melted_df['hour'] = melted_df['hour_label'].str.extract(r'(\d+)').astype(int)
melted_df['datetime'] = pd.to_datetime(melted_df['date']) + pd.to_timedelta(melted_df['hour'], unit='h')

# 3. 长表转宽表,将Variable转为列名
pivoted_df = melted_df.pivot(
    index=['datetime', 'station_code'],
    columns='Variable',
    values='variable_value'
).reset_index()

# 清理列名层级(可选操作)
pivoted_df.columns.name = None

关键细节说明

  • melt的value_vars用列表推导式生成列名,避免手动输入所有H01-H24。
  • 用正则(\d+)提取小时数,确保从H01到H24都能正确获取1-24的整数。
  • 生成datetime时,先将date转为datetime类型再加小时差,比字符串拼接更稳定。
  • 若存在同一datetime+station_code+Variable的重复值,建议替换为pivot_table并指定aggfunc(如aggfunc='mean')做聚合处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:25:07