标记重叠日期时间范围:为元组添加冲突标识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
相关产品推荐
相关产品推荐

