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

如何高效转换含时间序列的Pandas DataFrame格式?

高效实现Pandas时间序列数据的宽表转置

核心思路

用Pandas内置的向量化重塑操作(melt + pivot/pivot_table)替代交叉连接,避免数据量爆炸,10万级数据可实现秒级处理。

分步实现代码

假设你的原始DataFrame名为df,包含Customer、Item、Date以及00:00至23:30的时段列:

  1. 提取时段列并转成长格式
    把横向的时段列转为纵向键值对,保留Customer、Item、Date作为标识列:

    import pandas as pd
    
    # 自动识别所有时段列(排除非时段列)
    time_cols = [col for col in df.columns if col not in ['Customer', 'Item', 'Date']]
    
    # 宽转长:将时段列拆分为Time(时段)和Value(对应数值)
    melted_df = df.melt(
        id_vars=['Customer', 'Item', 'Date'],
        value_vars=time_cols,
        var_name='Time',
        value_name='Value'
    )
    
  2. 合并日期和时段为完整时间戳
    将Date和Time拼接后转为datetime类型,作为行维度的时间索引:

    # 拼接日期+时段,转为时间戳
    melted_df['Timestamp'] = pd.to_datetime(
        melted_df['Date'].astype(str) + ' ' + melted_df['Time']
    )
    
    # 删除冗余列,减少内存占用
    melted_df = melted_df.drop(columns=['Date', 'Time'])
    
  3. 将Item转为列(最终重塑)
    用pivot或pivot_table把Item转成横向列,Customer和Timestamp作为行索引:

    # 无重复值时用pivot(速度更快)
    final_df = melted_df.pivot(
        index=['Customer', 'Timestamp'],
        columns='Item',
        values='Value'
    ).reset_index()
    
    # 若存在同一Customer+Timestamp+Item的重复数据,用pivot_table聚合
    # final_df = melted_df.pivot_table(
    #     index=['Customer', 'Timestamp'],
    #     columns='Item',
    #     values='Value',
    #     aggfunc='sum',  # 可替换为'mean'等,根据业务需求
    #     fill_value=0
    # ).reset_index()
    
    # 填充缺失值(如无对应Item的数据填0)
    final_df = final_df.fillna(0)
    

为什么比交叉连接高效?

交叉连接会生成原行数 × 时段数 × Item数的笛卡尔积,数据量瞬间膨胀到百万甚至千万级;而melt仅生成原行数 × 时段数的中间数据,后续pivot是聚合操作,不会额外放大数据量,全程都是Pandas优化的向量化运算,性能提升几个数量级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:07:25