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

如何检测pandas DataFrame两列分组下的时间区间重叠

pandas 同组区间重叠检测实现方案

针对你提到的场景,核心逻辑是先按A、B两列分组,再对组内的时间区间做重叠判断,具体实现如下:

前置逻辑说明

两个闭区间[start1, end1]和[start2, end2]存在重叠的判断条件为:start1 <= end2 且 start2 <= end1。
你数据中的Monthfrom和Monthto为YYYYMM格式的数值,本身可直接比较大小,无需额外转日期格式,有特殊需求也可先转成pandas日期类型再处理。

实现代码

方案1:快速检测是否存在重叠、标记重叠行

该方案通过排序后和前一行比对的方式实现,计算效率高,适合大数据量场景:

import pandas as pd

# 构造示例数据(你实际用的时候替换成自己的df即可)
data = {
    'A': ['XCP25', 'XCP25', 'XCP25', 'FHA23', 'FHA23'],
    'B': ['MW', 'MW', 'XY', 'CY', 'ZW'],
    'Monthfrom': [202006, 202007, 202006, 202006, 202006],
    'Monthto': [202011, 202012, 202011, 202011, 202011]
}
df = pd.DataFrame(data)

# 1. 按分组键+区间起始值排序
df_sorted = df.sort_values(['A', 'B', 'Monthfrom']).reset_index(drop=True)

# 2. 取每组内上一行的区间结束值
df_sorted['prev_monthto'] = df_sorted.groupby(['A', 'B'])['Monthto'].shift(1)

# 3. 判断是否重叠:当前行起始 <= 上一行结束 即存在重叠
df_sorted['is_overlap'] = df_sorted['Monthfrom'] <= df_sorted['prev_monthto']

# 额外:提取所有存在重叠的(A,B)组合
overlap_groups = df_sorted[df_sorted['is_overlap']][['A', 'B']].drop_duplicates()

运行后示例数据的第二行is_overlap会被标记为True,正好匹配你提到的前两行重叠的场景。

方案2:找出所有两两重叠的行对

如果需要定位具体哪几行互相重叠,可以用自连接的方式实现:

def check_group_all_overlap(group):
    # 组内自连接生成所有行对,过滤自己和自己、重复比对的情况
    pairs = group.merge(group, on=['A', 'B'], suffixes=('_x', '_y'))
    pairs = pairs[pairs.index_orig_x < pairs.index_orig_y]
    # 应用重叠判断规则
    pairs['is_overlap'] = (pairs['Monthfrom_x'] <= pairs['Monthto_y']) & (pairs['Monthfrom_y'] <= pairs['Monthto_x'])
    return pairs[pairs['is_overlap']]

# 给原数据加原始行号方便定位
df_with_idx = df.reset_index(names='index_orig')
# 分组检测所有重叠行对
all_overlap_pairs = df_with_idx.groupby(['A', 'B'], group_keys=False).apply(check_group_all_overlap).reset_index(drop=True)

自定义调整

  • 如果你的业务逻辑中区间是左闭右开(比如Monthto不包含在区间内),把判断条件中的<=改为<即可
  • 如需同时统计重叠时长,可以额外做日期转换后计算差值

内容的提问来源于stack exchange,提问作者Fernando Hernández

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:07