Python中拆分并合并字典列表的重叠日期区间及对应值
处理重叠日期区间并合并对应Values的Python实现
问题描述
给定包含start(起始时间)、end(结束时间)和values(值列表)的字典列表,其中日期区间可能存在重叠,需要将其拆分为无重叠的唯一时间段,并合并每个时间段内所有重叠原始区间的values。
示例输入:
[ # 覆盖一整年的区间 { "values": ["a", "b", "c"], "start": "2023-01-01T00:00:00+00:00", "end": "2024-01-01T00:00:00+00:00", }, # 与上述区间重叠的一个月,带有新值 { "values": ["d", "e"], "start": "2023-02-01T00:00:00+00:00", "end": "2023-03-01T00:00:00+00:00", }, ]
期望输出(修正原示例中的日期笔误):
[ { "values": ["a", "b", "c"], "start": "2023-01-01T00:00:00+00:00", "end": "2023-02-01T00:00:00+00:00", }, { "values": ["a", "b", "c", "d", "e"], "start": "2023-02-01T00:00:00+00:00", "end": "2023-03-01T00:00:00+00:00", }, { "values": ["a", "b", "c"], "start": "2023-03-01T00:00:00+00:00", "end": "2024-01-01T00:00:00+00:00", }, ]
实现思路
- 提取并排序所有时间边界:把所有原始区间的
start和end提取出来,转成可比较的datetime对象,排序后得到所有拆分时段的边界点。 - 遍历拆分后的时段:对每一对相邻的边界点,作为新时段的
start和end。 - 合并对应时段的Values:检查哪些原始区间完全覆盖当前新时段,合并这些区间的
values(可选择去重)。 - 格式转换与结果整理:把
datetime对象转回字符串格式,生成最终的字典列表。
代码实现
from datetime import datetime def merge_overlapping_intervals(intervals): # 1. 提取所有时间点并转成datetime对象 time_points = [] for interval in intervals: start_dt = datetime.fromisoformat(interval["start"]) end_dt = datetime.fromisoformat(interval["end"]) time_points.append(start_dt) time_points.append(end_dt) # 2. 排序时间点并去重 time_points = sorted(list(set(time_points))) result = [] # 3. 遍历每一对相邻时间点,生成新时段 for i in range(len(time_points) - 1): current_start = time_points[i] current_end = time_points[i+1] # 跳过长度为0的时段(时间点重复的情况) if current_start == current_end: continue # 4. 收集所有覆盖当前时段的原始区间的values merged_values = [] for interval in intervals: interval_start = datetime.fromisoformat(interval["start"]) interval_end = datetime.fromisoformat(interval["end"]) # 检查原始区间是否覆盖当前时段 if interval_start <= current_start and interval_end >= current_end: merged_values.extend(interval["values"]) # 可选:对values去重(保持顺序用dict.fromkeys,打乱顺序用set) # merged_values = list(dict.fromkeys(merged_values)) # 5. 转成字符串格式并加入结果 result.append({ "values": merged_values, "start": current_start.isoformat(), "end": current_end.isoformat() }) return result # 测试示例输入 input_intervals = [ { "values": ["a", "b", "c"], "start": "2023-01-01T00:00:00+00:00", "end": "2024-01-01T00:00:00+00:00", }, { "values": ["d", "e"], "start": "2023-02-01T00:00:00+00:00", "end": "2023-03-01T00:00:00+00:00", }, ] output = merge_overlapping_intervals(input_intervals) # 打印结果 for item in output: print(item)
说明
- 时间格式处理:使用
datetime.fromisoformat()和isoformat()处理ISO标准时间字符串,确保时间比较的准确性。 - 去重选项:如果需要合并后的
values无重复,可以取消代码中去重行的注释,dict.fromkeys()会保持原始顺序,set则会打乱顺序。 - 边界处理:自动跳过长度为0的时段(即重复的时间点),避免生成无效区间。
内容的提问来源于stack exchange,提问作者TKems
相关产品推荐
相关产品推荐

