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

将pandas dataframe中H1/H2等小时列数据转换为datetime与value两列序列

pandas无循环实现宽表转时间序列长表方案

完全不需要写for循环,用pandas原生melt+时间拼接的向量化操作即可实现,性能远高于循环实现,具体方案如下:

步骤说明

  1. 用melt方法将H1~H24的列从宽格式转为长格式
  2. 提取小时列的数字标识,和原始日期列拼接为完整的datetime字段
  3. 筛选保留需要的字段并按时间排序

完整代码

import pandas as pd

# 这里df替换为你自己的原始DataFrame
result = (
    # 宽转长:保留日期列,展开所有H开头的小时列
    df.melt(
        id_vars="date",  # 如果你原始日期列的名称不是date,这里替换成实际列名
        var_name="hour_tag",
        value_name="value"
    )
    # 提取小时数值、拼接完整时间
    .assign(
        hour = lambda x: x["hour_tag"].str.removeprefix("H").astype(int),
        datetime = lambda x: pd.to_datetime(x["date"]) + pd.to_timedelta(x["hour"], unit="h")
    )
    # 保留目标字段、按时间排序
    .loc[:, ["datetime", "value"]]
    .sort_values("datetime", ignore_index=True)
)

补充说明

  • 如果你的小时列命名不是严格的H1到H24,调整melt的value_vars参数指定要展开的列即可
  • 如果原始日期列已经是datetime类型,pd.to_datetime(x["date"])可以直接简化为x["date"]
  • 如果业务定义H24对应当天23:00而非次日00:00,在计算hour的时候减1即可:hour = lambda x: x["hour_tag"].str.removeprefix("H").astype(int) - 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:24:05