将pandas dataframe中H1/H2等小时列数据转换为datetime与value两列序列
pandas无循环实现宽表转时间序列长表方案
完全不需要写for循环,用pandas原生melt+时间拼接的向量化操作即可实现,性能远高于循环实现,具体方案如下:
步骤说明
- 用
melt方法将H1~H24的列从宽格式转为长格式 - 提取小时列的数字标识,和原始日期列拼接为完整的datetime字段
- 筛选保留需要的字段并按时间排序
完整代码
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
相关产品推荐
相关产品推荐

