如何将Pandas DataFrame多行多列数据重构为单行格式?
Pandas 60分钟K线长表转单日期宽表实现
实现步骤
- 预处理原始数据:删除无用的
type列,从time字段提取小时数,固定周期标识为60(对应原sixty-min 60分钟线) - 透视表转换:以
date为行索引,小时为列维度,把所有行情指标摊平为宽列,按照周期 小时 指标名的规则生成新列名 - 列顺序对齐:按照给出的目标列结构调整列顺序,保证输出格式完全匹配
完整代码
import pandas as pd # 假设原始DataFrame变量名为df # 1. 字段预处理 df["hour"] = df["time"].astype(str).str.slice(0, 2).astype(int) df = df.drop(columns=["type"]) # 2. 透视转宽表 pivot_df = df.pivot( index="date", columns="hour", values=["open", "close", "change", "high", "low", "200ema", "50ema"] ) # 按规则重命名列 pivot_df.columns = [f"60 {hour} {metric}" for metric, hour in pivot_df.columns] pivot_df = pivot_df.reset_index() # 3. 按目标列顺序重排 target_columns = [ 'date', '60 9 open', '60 9 close', '60 9 change', '60 9 high', '60 9 low', '60 9 200ema', '60 9 50ema', '60 10 open', '60 10 close', '60 10 change', '60 10 high', '60 10 low', '60 10 200ema', '60 10 50ema', '60 11 open', '60 11 close', '60 11 change', '60 11 high', '60 11 low', '60 11 200ema', '60 11 50ema', '60 12 open', '60 12 close', '60 12 change', '60 12 high', '60 12 low', '60 12 200ema', '60 12 50ema', '60 13 open', '60 13 close', '60 13 change', '60 13 high', '60 13 low', '60 13 200ema', '60 13 50ema', '60 14 open', '60 14 close', '60 14 change', '60 14 high', '60 14 low', '60 14 200ema', '60 14 50ema', '60 15 open', '60 15 close', '60 15 change', '60 15 high', '60 15 low', '60 15 200ema', '60 15 50ema', '60 16 open', '60 16 close', '60 16 change', '60 16 high', '60 16 low', '60 16 200ema', '60 16 50ema' ] result = pivot_df.reindex(columns=target_columns)
注意事项
- 如果原始数据存在同一日期同一小时多条重复记录,需要先做去重处理再执行透视,否则会触发报错
- 原始数据中
200ema字段的空值会被完整保留,不会自动填充 - 如果数据包含多个交易日,最终结果会自动按每个交易日生成一行,完全符合单行单日期的要求
内容的提问来源于stack exchange,提问作者boioboi
相关产品推荐
相关产品推荐

