如何用Python DataFrame转换宽表为长表以绘制时间线图表?
宽表转时间序列长表的实现方案
针对每行对应客户ID、每列对应30分钟时间点数值的宽表,以下是几种主流工具的转长表方案,转换后即可直接用于时间线图表绘制:
Python(Pandas)
这是处理批量数据最高效的方式,核心使用melt方法完成宽表转长表:
import pandas as pd # 读取宽表数据(示例为CSV格式,可根据实际调整读取方式) df_wide = pd.read_csv("customer_time_data.csv") # 执行宽转长:保留customer_id列,将所有时间列转为timestamp行,对应数值转为value列 df_long = df_wide.melt( id_vars=["customer_id"], var_name="timestamp", value_name="value" ) # 可选:将timestamp列转为时间类型,便于后续时间序列分析和绘图 df_long["timestamp"] = pd.to_datetime(df_long["timestamp"]) # 保存转换后的长表 df_long.to_csv("customer_time_long.csv", index=False)
SQL(以PostgreSQL/SQL Server为例)
如果数据存储在数据库中,可通过SQL语句直接完成转换:
PostgreSQL(使用LATERAL JOIN + 动态SQL)
适合列数较多的场景,自动生成所有时间列的转换逻辑:
DO $$ DECLARE cols text; BEGIN -- 自动拼接所有非customer_id列的转换语句 SELECT string_agg(format('(''%s'', "%s")', column_name, column_name), ', ') INTO cols FROM information_schema.columns WHERE table_name = 'customer_time_data' AND column_name != 'customer_id'; -- 执行动态生成的转长表SQL EXECUTE format(' SELECT customer_id, timestamp_column AS timestamp, value_column AS value FROM customer_time_data LATERAL (VALUES %s) AS unpivoted(timestamp_column, value_column) ', cols); END $$;
SQL Server(使用CROSS APPLY)
SELECT customer_id, unpivoted.timestamp, unpivoted.value FROM customer_time_data CROSS APPLY ( VALUES ('2024-01-01 00:00', [2024-01-01 00:00]), ('2024-01-01 00:30', [2024-01-01 00:30]), -- 按此格式列出所有时间列,或使用动态SQL批量生成 ... ) AS unpivoted(timestamp, value);
Excel(Power Query)
适合非编程用户,可视化操作完成转换:
- 选中包含表头的整个数据区域
- 点击「数据」选项卡 → 「从表格/区域」,进入Power Query编辑器
- 选中
customer_id列,右键选择「逆透视其他列」 - 将自动生成的「属性」列重命名为
timestamp,「值」列重命名为value - 点击「关闭并上载」,转换后的长表将导入新工作表
注意事项
- 转换后建议将
timestamp列转为标准时间类型,避免后续绘图时出现格式问题 - 若原表存在缺失值,转换后会保留空值(如Pandas的
NaN、SQL的NULL),可根据需求选择删除或填充 - 针对超大量列的场景(如一个月的30分钟数据共1440列),优先选择Python或动态SQL方案,避免手动操作失误
内容的提问来源于stack exchange,提问作者Ahmed Raafat
相关产品推荐
相关产品推荐

