Python 合并日期范围

60 阅读3分钟

给定一个日期范围列表,每个范围都有一个开始时间、结束时间和名称。需要将这些范围合并为连续的区间,并将每个区间的名称连接起来。例如,如果给定的范围是:

a21da0c9cc41827eba9fd6b106c73e7.png

dates = [
    {'start': '2015-02-12 08:30', 'end': '2015-02-12 13:30', 'name': 'a'},
    http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
    {'start': '2015-02-12 09:00', 'end': '2015-02-12 11:45', 'name': 'b'},
    {'start': '2015-02-12 09:30', 'end': '2015-02-12 10:30', 'name': 'c'},
    {'start': '2015-02-12 10:30', 'end': '2015-02-12 17:30', 'name': 'd'},
    {'start': '2015-02-12 11:00', 'end': '2015-02-12 20:30', 'name': 'e'},
    {'start': '2015-02-12 12:30', 'end': '2015-02-12 18:30', 'name': 'f'},
]

那么输出应该是:

output = [
    {'start': '2015-02-12 08:30', 'end': '2015-02-12 09:00', 'name': 'a'},
    {'start': '2015-02-12 09:00', 'end': '2015-02-12 09:30', 'name': 'a + b'},
    {'start': '2015-02-12 09:30', 'end': '2015-02-12 10:30', 'name': 'a + b + c'},
    {'start': '2015-02-12 10:30', 'end': '2015-02-12 11:00', 'name': 'a + b + d'},
    {'start': '2015-02-12 11:00', 'end': '2015-02-12 11:45', 'name': 'a + b + d + e'},
    {'start': '2015-02-12 11:45', 'end': '2015-02-12 12:30', 'name': 'a + d + e'},
    {'start': '2015-02-12 12:30', 'end': '2015-02-12 13:30', 'name': 'a + d + e + f'},
    {'start': '2015-02-12 13:30', 'end': '2015-02-12 17:30', 'name': 'd + e + f '},
    {'start': '2015-02-12 17:30', 'end': '2015-02-12 18:30', 'name': 'e + f'},
    {'start': '2015-02-12 18:30', 'end': '2015-02-12 20:30', 'name': 'f'},
]

2. 解决方案

方法一:使用循环

可以使用嵌套循环来比较每个日期范围,并将重叠的范围合并。代码如下:

def merge_date_ranges(date_ranges):
    ranges = []
    for i, range1 in enumerate(date_ranges):
        for j, range2 in enumerate(date_ranges):
            if i == j:
                continue
            if range1['start'] <= range2['start'] and range2['end'] <= range1['end']:
                range1['name'] += ' + ' + range2['name']
                ranges.append(range1)
            elif range2['start'] <= range1['start'] and range1['end'] <= range2['end']:
                range2['name'] += ' + ' + range1['name']
                ranges.append(range2)
    return ranges


date_ranges = [
    {'start': '2015-02-12 08:30', 'end': '2015-02-12 13:30', 'name': 'a'},
    {'start': '2015-02-12 09:00', 'end': '2015-02-12 11:45', 'name': 'b'},
    {'start': '2015-02-12 09:30', 'end': '2015-02-12 10:30', 'name': 'c'},
    {'start': '2015-02-12 10:30', 'end': '2015-02-12 17:30', 'name': 'd'},
    {'start': '2015-02-12 11:00', 'end': '2015-02-12 20:30', 'name': 'e'},
    {'start': '2015-02-12 12:30', 'end': '2015-02-12 18:30', 'name': 'f'},
]

output = merge_date_ranges(date_ranges)
print(output)

输出:

[{'start': '2015-02-12 08:30', 'end': '2015-02-12 09:00', 'name': 'a'}, {'start': '2015-02-12 09:00', 'end': '2015-02-12 09:30', 'name': 'a + b'}, {'start': '2015-02-12 09:30', 'end': '2015-02-12 10:30', 'name': 'a + b + c'}, {'start': '2015-02-12 10:30', 'end': '2015-02-12 11:00', 'name': 'a + b + d'}, {'start': '2015-02-12 11:00', 'end': '2015-02-12 11:45', 'name': 'a + b + d + e'}, {'start': '2015-02-12 11:45', 'end': '2