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

标记重叠日期时间范围:为元组添加冲突标识Y/N的技术问询

嘿,这个需求其实很典型,我来给你拆解清楚实现思路和具体代码吧~

核心思路梳理

要解决这个问题,关键要做好两件事:把字符串时间转成可比较的时间对象,以及明确两个时间区间冲突的判断逻辑。

1. 先把时间字符串转成datetime对象

因为像'15MAR18 103000'这种字符串没法直接比较先后,所以第一步必须把它们转换成Python的datetime对象,这样才能轻松做时间大小对比。

用datetime.strptime()方法就能实现,对应的格式符是'%d%b%y %H%M%S'(解释:%d是日期,%b是英文月份缩写,%y是两位年份,%H%M%S是时分秒)。

示例转换函数:

from datetime import datetime

def str_to_datetime(time_str):
    return datetime.strptime(time_str, '%d%b%y %H%M%S')

2. 明确区间冲突的判断逻辑

两个时间区间[start1, end1]和[start2, end2],什么时候算冲突?其实就是它们的时间范围有重叠部分。换个角度说:

只要不是其中一个区间完全在另一个区间的外面,就说明有冲突

翻译成代码逻辑就是:

def is_conflict(interval1, interval2):
    start1, end1 = interval1
    start2, end2 = interval2
    # 两个区间有重叠的条件:A的开始早于B的结束,且B的开始早于A的结束
    return start1 < end2 and start2 < end1

拿你的示例数据来说:

  • 第一个区间:10:30:00 ~ 10:37:58
  • 第二个区间:10:35:55 ~ 12:13:08
    显然满足10:30:00 < 12:13:08且10:35:55 < 10:37:58,所以两个区间冲突。

3. 遍历所有区间,逐个检查冲突

接下来要遍历列表里的每个区间,和除自己之外的所有区间对比:只要有一个冲突,就给这个区间标记'Y',否则标记'N'。

4. 整合所有步骤的完整代码

把上面的逻辑整合起来,就能得到最终的实现:

from datetime import datetime

def str_to_datetime(time_str):
    # 将字符串时间转换为可比较的datetime对象
    return datetime.strptime(time_str, '%d%b%y %H%M%S')

def is_conflict(interval1, interval2):
    # 判断两个时间区间是否存在冲突
    start1, end1 = interval1
    start2, end2 = interval2
    return start1 < end2 and start2 < end1

def add_conflict_flag(interval_list):
    # 先把所有原始时间字符串转成datetime区间
    dt_intervals = [
        (str_to_datetime(start), str_to_datetime(end)) 
        for start, end in interval_list
    ]
    
    result = []
    for idx, current_dt_interval in enumerate(dt_intervals):
        has_conflict = False
        # 遍历其他所有区间,检查是否有冲突
        for other_idx, other_dt_interval in enumerate(dt_intervals):
            if idx == other_idx:
                continue  # 跳过自己,不和自己对比
            if is_conflict(current_dt_interval, other_dt_interval):
                has_conflict = True
                break  # 只要找到一个冲突就停止检查
        
        # 把原始时间和标识组合,加入结果列表
        original_start, original_end = interval_list[idx]
        result.append((original_start, original_end, 'Y' if has_conflict else 'N'))
    
    return result

# 测试你的示例数据
tup = [('15MAR18 103000', '15MAR18 103758'), ('15MAR18 103555', '15MAR18 121308')]
print(add_conflict_flag(tup))

运行这段代码,输出会是:

[('15MAR18 103000', '15MAR18 103758', 'Y'), ('15MAR18 103555', '15MAR18 121308', 'Y')]

额外优化提示

如果你的时间区间数量特别大,双重循环的效率可能不够高。这时候可以先把所有区间按开始时间排序,然后只需要和相邻的区间对比就能判断冲突,能大幅提升效率——不过这个是进阶优化,小数据量的话用上面的基础方法完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:21:22