【问题标题】:Find overlapping time segments in python在python中查找重叠的时间段
【发布时间】:2023-04-01 03:29:01
【问题描述】:

我正在尝试检查同一 file_id 中的两个时间段(由其表示为 time_from 和 time_to 的持续时间标识)是否在以下数据帧中重叠:

df1
    id,file_id,time_from,time_to
    1,10,00:00:19,00:00:25
    2,12,00:02:39,00:02:49
    3,12,00:04:18,00:04:30
    4,12,00:05:30,00:05:55
    5,15,00:01:35,00:01:38
    6,18,00:07:35,00:07:48


df2 
    id,file_id,time_from,time_to
    1,10,00:00:18,00:00:26
    2,12,00:02:30,00:02:49
    3,12,00:05:28,00:05:56
    4,15,00:01:40,00:01:50

基本上,我想计算同一 file_id 的两个数据帧中段重叠的次数,允许 time_from 和 time_to 之间的距离给定程度(比如 +/- 4 秒)。

输出应该是这样的:

file_id, number_of_overlapping_segments
10, 1
12, 2
15, 1
18, 0

这是两个时间段不重叠且算法应返回 0(假设距离大于 4 秒)的唯一情况。其他所有情况都应返回 1:

               [_____]

   [________]           [______]

到目前为止,我的方法是使用 pandas 将时间值左右(限制)延长 4 秒
给定的时间段并创建临时数据帧来保存具有重叠时间段的行。
示例:

import pandas as pd

left_overlap = []
right_overlap = []

for f in list(set(df1.file_id) & set(df2.file_id)):
    for t_from, t_from_lim in list(zip(df2[df2.file_id==f]['time_from'],
                                       df1[df1file_id==f]['time_from_limit'])):
        if t_from > t_from_lim:
            left_overlap.append(df_2[(df2.file_id==audio) & \
                                             (df2.time_from==t_from)])

df_left_overlap = pd.concat(left_overlap).reset_index(drop=True)


for f in list(set(df1.file_id) & set(df2.file_id)):
    for t_to, t_to_lim in list(zip(df_left_overlap[df_left_overlap.file_id==f]['time_to'],
                                       df1[df1.file_id==f]['time_to_limit'])):
        if t_to < t_to_lim:
            right_overlap.append(
                df_left_overlap[(df_left_overlap.file_id==f) & \
                                    (df_left_overlap.time_to==t_to)])

overlap = pd.concat(right_overlap)

我认为这个解决方案效率不高,我希望找到一种更强大的方法。

提前致谢!

【问题讨论】:

标签:
python
pandas
datetime
overlap