如何调整pandas DataFrame结构 将列转换为值生成datetime与数值列
处理思路
- 第一步:原始数据结构探查
先执行基础命令定位数据特征,无需提前知道原始结构:- 执行
df.info()查看所有列的字段类型、非空值占比 - 执行
df.head(10)查看前10行的实际数据存储格式 - 执行
df.columns.tolist()输出全量列名,定位疑似时间字段和数值字段的位置
- 执行
- 第二步:时间字段转换为标准datetime格式
根据你定位到的时间字段存储格式,对应转换:- 字符串格式时间:使用
pd.to_datetime(df['原时间列名'], format='匹配的时间格式', errors='coerce'),errors='coerce'会自动把无法解析的异常值转为NaT,方便后续过滤 - 数值型时间戳:额外指定单位参数,秒级时间戳加
unit='s',毫秒级加unit='ms' - 分栏存储的时间(年/月/日/时分分别存在不同列):直接传入多列合并转换
pd.to_datetime(df[['年列','月列','日列','时列']])
转换完成后将该列命名为datetime存入DataFrame即可。
- 字符串格式时间:使用
- 第三步:提取目标数值列并调整结构
按需筛选、调整表结构即可:- 只需保留指定数值列:直接做列筛选
result_df = df[['datetime', '数值列1', '数值列2', ...]] - 时间原存储在索引中:先执行
df = df.reset_index(names='datetime')把索引转为普通列再筛选 - 原数据为宽表需要转长表:用
pd.melt(df, id_vars='datetime')将所有非时间列转为“变量名+数值”的长结构 - 原数据为长表需要转宽表:用
pd.pivot(df, index='datetime', columns='分类列', values='数值列')生成指定维度的宽表
- 只需保留指定数值列:直接做列筛选
- 第四步:异常值清洗
最后过滤掉时间列异常的行:result_df = result_df.dropna(subset=['datetime']),也可以根据业务需要对数值列做空值填充、异常值过滤操作。
参考示例代码
import pandas as pd # 示例场景:原始数据的ts列是毫秒级时间戳,需要保留value、count两个数值列 df['datetime'] = pd.to_datetime(df['ts'], unit='ms', errors='coerce') result_df = df[['datetime', 'value', 'count']].dropna(subset=['datetime'])
内容的提问来源于stack exchange,提问作者MT467
相关产品推荐
相关产品推荐

