规整时间序列数据:Dataframe时间格式转换技术咨询
解决方法:宽表转长表并合并时间序列
这是个很常见的宽表转长表+时间合并的需求,用pandas就能轻松搞定,我给你一步步拆解:
1. 先明确原始数据结构
假设你的原始DataFrame长这样(行是小时0-23,列是日期,单元格是对应记录值):
import pandas as pd import numpy as np # 构造示例数据 dates = pd.date_range('2024-01-01', periods=3).strftime('%Y-%m-%d') hours = range(24) df = pd.DataFrame(np.random.randn(24, 3), index=hours, columns=dates) df.index.name = 'hour'
2. 把小时索引转为普通列
首先需要把行索引的「小时」转成单独的列,方便后续合并:
df_reset = df.reset_index()
3. 将宽表转成长表(核心步骤)
用melt()函数把多列的日期合并成一个「日期」列,对应的记录值统一放到「record」列:
df_melted = df_reset.melt( id_vars='hour', # 保留不变的列:小时 var_name='date', # 原来的日期列名会变成这个列的取值 value_name='record' # 原来的单元格值会放到这个列里 )
4. 合并日期与小时为时间序列
把「date」和「hour」列合并成标准的datetime类型时间戳,这里注意给小时补零保证格式正确:
# 给小时补零(比如5→05),避免时间解析出错 df_melted['hour_str'] = df_melted['hour'].apply(lambda x: f"{x:02d}") # 合并成时间戳 df_melted['timestamp'] = pd.to_datetime(df_melted['date'] + ' ' + df_melted['hour_str'])
5. 整理最终结果
最后可以调整列顺序、删除多余列,按时间排序:
final_df = df_melted[['timestamp', 'record']].sort_values('timestamp').reset_index(drop=True)
这样你就得到了想要的结构:一列是完整的时间序列,另一列是对应记录值。
内容的提问来源于stack exchange,提问作者Gilliard Nunes
相关产品推荐
相关产品推荐

