You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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 IDMerged 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:35:16