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

如何按values_1分组提取存在时间重叠的DataFrame行?

技术实现方案:分组提取时间重叠的DataFrame行

核心思路

按values_1字段分组后,对每组内的时间区间(Start DateTime和End DateTime)进行重叠检测,仅保留至少与组内某一行存在时间重叠的记录,同时兼容非连续日期场景。

步骤实现

1. 确保日期列格式正确

先将日期列转换为datetime类型(若原始数据未转换):

import pandas as pd

# 转换日期列格式
df['Start DateTime'] = pd.to_datetime(df['Start DateTime'])
df['End DateTime'] = pd.to_datetime(df['End DateTime'])

2. 定义分组处理函数

编写函数实现单组内的重叠检测与筛选:

def filter_overlapping(group):
    # 按起始时间排序,便于重叠判断
    sorted_group = group.sort_values('Start DateTime').reset_index(drop=True)
    row_count = len(sorted_group)
    # 初始化重叠标记数组
    has_overlap = [False] * row_count

    # 检查当前行与前一行的重叠
    for i in range(1, row_count):
        prev_end = sorted_group.iloc[i-1]['End DateTime']
        curr_start = sorted_group.iloc[i]['Start DateTime']
        if curr_start < prev_end:
            has_overlap[i] = True
            has_overlap[i-1] = True

    # 检查当前行与后一行的重叠(覆盖跨多行的间接重叠场景)
    for i in range(row_count - 1):
        curr_end = sorted_group.iloc[i]['End DateTime']
        next_start = sorted_group.iloc[i+1]['Start DateTime']
        if curr_end > next_start:
            has_overlap[i] = True
            has_overlap[i+1] = True

    # 返回存在重叠的行
    return sorted_group[has_overlap]

3. 分组应用筛选函数

对values_1分组后应用上述函数,得到最终结果:

result_df = df.groupby('values_1', group_keys=False).apply(filter_overlapping)

关键说明

  • 重叠判断逻辑:默认采用「当前区间起始时间早于另一区间结束时间」作为重叠标准,若业务需要包含端点(如Start DateTime等于另一行的End DateTime也算重叠),可将条件中的<改为<=、>改为>=。
  • 非连续日期兼容:通过先排序再逐行检测的方式,无论日期是否连续,只要组内存在重叠区间就会被识别并保留。
  • 目标效果匹配:自动剔除组内无任何重叠的行(如VGM组的uniqId=2567、WEH组的uniqId=9854),保留所有行均重叠的组(如POH、PNM组)。

内容的提问来源于stack exchange,提问作者Tarak Pandya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:03:18