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

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",
    },
]

实现思路

  1. 提取并排序所有时间边界:把所有原始区间的start和end提取出来,转成可比较的datetime对象,排序后得到所有拆分时段的边界点。
  2. 遍历拆分后的时段:对每一对相邻的边界点,作为新时段的start和end。
  3. 合并对应时段的Values:检查哪些原始区间完全覆盖当前新时段,合并这些区间的values(可选择去重)。
  4. 格式转换与结果整理:把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:37:14