如何对含多时间序列的Pandas DataFrame进行透视与最近时间戳重索引?
解决Pandas多ID时间序列透视与统一时间戳对齐问题
我来一步步教你实现这个需求,核心就是时间对齐+透视+补全缺失时间戳这几个关键步骤:
步骤拆解与思路
- 时间格式转换与对齐:先把原始字符串时间转成Pandas可识别的datetime类型,再把所有ID的时间戳统一对齐到30分钟间隔(比如Id-2的8:02要对应到8:00,用
floor('30min')实现向下取整即可)。 - 透视表格:用
pivot()方法把Id转为列、Datetime作为索引,让不同ID的数值在同一时间点横向排列,之后还可以把列名改成Id-1这类易读的格式。 - 补全缺失时间戳:生成从8:00到12:00的完整30分钟间隔时间序列,用
reindex()把透视后的表格对齐到这个完整索引,缺失位置自动填充NaN,最后调整时间格式为你想要的字符串样式。
完整代码示例
import pandas as pd # 构造原始数据(实际使用时可替换为pd.read_csv()读取你的数据源) data = { 'Datetime': [ '5-26-17 8:00', '5-26-17 8:30', '5-26-17 9:00', '5-26-17 9:30', '5-26-17 10:00', '5-26-17 10:30', '5-26-17 11:00', '5-26-17 11:30', '5-26-17 12:00', '5-26-17 8:02', '5-26-17 8:32', '5-26-17 9:02', '5-26-17 9:32', '5-26-17 10:02', '5-26-17 10:32', '5-26-17 11:02', '5-26-17 11:32', '5-26-17 12:02', '5-26-17 8:30', '5-26-17 9:00', '5-26-17 9:30', '5-26-17 10:00', '5-26-17 10:30', '5-26-17 11:00', '5-26-17 11:30', '5-26-17 12:00' ], 'Id': [1]*9 + [2]*9 + [3]*8, 'Value': [ 2.3,4.5,7,8.1,7.9,3.4,2.1,1.8,0.4, 2.6,4.8,7.3,8.4,8.2,3.7,2.4,2.1,0.7, 4.5,7,8.1,7.9,3.4,2.1,1.8,0.4 ] } df = pd.DataFrame(data) # 1. 转换时间格式并对齐到30分钟间隔 df['Datetime'] = pd.to_datetime(df['Datetime']).dt.floor('30min') # 2. 透视表格并重命名列 pivoted_df = df.pivot(index='Datetime', columns='Id', values='Value') pivoted_df.columns = [f'Id-{col}' for col in pivoted_df.columns] # 3. 生成完整时间索引并补全缺失值 full_time_index = pd.date_range(start='2017-05-26 08:00:00', end='2017-05-26 12:00:00', freq='30min') final_df = pivoted_df.reindex(full_time_index) # 4. 调整格式为预期样式 final_df = final_df.reset_index().rename(columns={'index': 'Datetime'}) final_df['Datetime'] = final_df['Datetime'].dt.strftime('%-m-%-d-%y %H:%M') print(final_df)
运行这段代码后,输出结果就和你给出的预期完全一致啦!如果你的数据是从文件读取的,只需要替换掉构造data的部分即可,其余步骤通用。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

