如何在Pandas中合并含重复时间窗口列的传感器DataFrame?
Pandas按30秒时间窗口对齐合并多传感器数据
实现思路
核心是给每个时间窗口内的每条数据添加组内序号,用「时间窗口(date) + 组内序号」作为合并键,通过外连接(outer join)实现同窗口内数据按采集顺序对齐,缺失位置自动填充NaN。
具体步骤
1. 为每个数据集添加组内序号
对每个传感器的DataFrame,按date分组后,用cumcount()生成组内递增的序号(代表该窗口内的第n次采集,从0开始计数)。
2. 多表外连接合并
以date和组内序号作为连接键,使用外连接合并所有数据集,确保所有窗口的所有采集位置都被保留,缺失值自动填充为NaN。
代码示例
用你提供的测试数据演示:
import pandas as pd # 构造测试数据 data1 = { 'date': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D'], 'value1': list(range(1, 20)) } data2 = { 'date': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D'], 'value2': list(range(1, 21)) } # 转为DataFrame并添加组内序号 df1 = pd.DataFrame(data1) df1['seq'] = df1.groupby('date').cumcount() # 每个date组内从0开始计数 df2 = pd.DataFrame(data2) df2['seq'] = df2.groupby('date').cumcount() # 外连接合并 merged_df = pd.merge(df1, df2, on=['date', 'seq'], how='outer') # 可选:调整列顺序或删除seq列 merged_df = merged_df[['date', 'value1', 'value2', 'seq']] print(merged_df)
结果说明
- 同一
date窗口下,seq相同的行对应窗口内的同一采集位置,数据自动对齐 - 某传感器在窗口内采集条数不足时,缺失的位置会填充
NaN(比如date='A'的seq=3行,value2为NaN;date='D'的seq=3/4行,value1为NaN) - 中间完整窗口(如B、C)合并后无缺失值
多传感器扩展
如果有3个及以上传感器数据,可使用functools.reduce批量合并:
from functools import reduce # 假设有df1, df2, df3三个已添加seq列的数据集 dfs = [df1, df2, df3] merged_df = reduce(lambda left, right: pd.merge(left, right, on=['date', 'seq'], how='outer'), dfs)
内容的提问来源于stack exchange,提问作者ethicalguy
相关产品推荐
相关产品推荐

