如何基于Pandas高效提取多传感器目标追踪的时间窗口?
高效合并传感器追踪时间窗口的Pandas方案
需求说明
现有存储3个传感器目标追踪数据的Pandas DataFrame,Sensor time列是[开始时间, 结束时间]格式的列表,需按目标聚合,得到至少一个传感器追踪的连续时间窗口(比如示例中第一个目标合并后为[0,12]和[14,20]),替代低效的循环实现。
高效实现步骤
1. 展开时间区间
先将每个目标的所有传感器时间区间拆分为单独的开始、结束列,方便后续分组处理:
import pandas as pd # 模拟原始DataFrame(对应你提供的截图结构) data = { 'Target ID': ['Target1', 'Target1', 'Target1', 'Target2', 'Target2', 'Target2'], 'Sensor time': [[0,5], [3,12], [14,20], [1,3], [6,8], [10,15]] } df = pd.DataFrame(data) # 拆分时间区间为单独列 df_expanded = df.copy() df_expanded[['start', 'end']] = pd.DataFrame(df_expanded['Sensor time'].tolist(), index=df_expanded.index)
2. 分组合并重叠/相邻区间
按Target ID分组后,对每组的时间区间排序并合并:
def merge_overlapping_intervals(intervals): # 按开始时间排序 sorted_intervals = sorted(intervals, key=lambda x: x[0]) merged = [] for interval in sorted_intervals: if not merged: merged.append(interval) else: last_start, last_end = merged[-1] curr_start, curr_end = interval # 当前区间与上一个合并区间重叠/相邻则合并 if curr_start <= last_end: merged[-1] = [last_start, max(last_end, curr_end)] else: merged.append(interval) return merged # 分组应用合并逻辑 merged_result = df_expanded.groupby('Target ID').apply( lambda x: merge_overlapping_intervals(list(zip(x['start'], x['end']))) ).reset_index(name='Merged Tracking Windows')
3. 最终结果
运行后merged_result的结构如下:
| Target ID | Merged Tracking Windows |
|---|---|
| Target1 | [[0, 12], [14, 20]] |
| Target2 | [[1, 3], [6, 8], [10,15]] |
效率优势
- 利用Pandas的
groupby向量化操作替代逐行循环,减少Python层面的迭代开销 - 合并逻辑核心是排序后线性扫描,时间复杂度为O(n log n)(主要来自排序),远优于嵌套循环的O(n²)
内容的提问来源于stack exchange,提问作者Jacob Shirley
相关产品推荐
相关产品推荐

