&引用;“合并”;python中的时间范围
我有一堆打开/关闭时间的“规则”,我希望合并这些规则,以获得当天的一组统一规则&引用;“合并”;python中的时间范围,python,datetime,Python,Datetime,我有一堆打开/关闭时间的“规则”,我希望合并这些规则,以获得当天的一组统一规则 from datetime import time times = [ {"time_open": time(9, 0), "time_close": time(11, 0)}, {"time_open": time(9, 0), "time_close": time(12, 0)}, {"time_open": time(13, 0), "time_close": time(18, 0)}
from datetime import time
times = [
{"time_open": time(9, 0), "time_close": time(11, 0)},
{"time_open": time(9, 0), "time_close": time(12, 0)},
{"time_open": time(13, 0), "time_close": time(18, 0)},
{"time_open": time(15, 0), "time_close": time(19, 0)},
]
# something would produce
merged_times = [
{"time_open": time(9, 0), "time_close": time(12, 0)},
{"time_open": time(13, 0), "time_close": time(19, 0)},
]
我脑子里有几种方法,但速度可能是选择方法的主要驱动力 您需要从一组已排序的时间间隔开始;如果尚未排序,请从以下内容开始:
from operator import itemgetter
sorted_times = sorted(times, key=itemgetter('time_open', 'time_close'))
然后,您可以通过比较开始时间和之前的结束时间来合并时间;当他们没有超过圈数时,产生更新的时间:
def merge_times(times):
times = iter(times)
merged = next(times).copy()
for entry in times:
start, end = entry['time_open'], entry['time_close']
if start <= merged['time_close']:
# overlapping, merge
merged['time_close'] = max(merged['time_close'], end)
else:
# distinct; yield merged and start a new copy
yield merged
merged = entry.copy()
yield merged
您需要从一组已排序的时间间隔开始;如果尚未排序,请从以下内容开始:
from operator import itemgetter
sorted_times = sorted(times, key=itemgetter('time_open', 'time_close'))
然后,您可以通过比较开始时间和之前的结束时间来合并时间;当他们没有超过圈数时,产生更新的时间:
def merge_times(times):
times = iter(times)
merged = next(times).copy()
for entry in times:
start, end = entry['time_open'], entry['time_close']
if start <= merged['time_close']:
# overlapping, merge
merged['time_close'] = max(merged['time_close'], end)
else:
# distinct; yield merged and start a new copy
yield merged
merged = entry.copy()
yield merged
合并规则的标准是什么?为什么从输出中删除最后一项?您的输入是否按开始和结束时间排序?@VanPeer:因为时间与之前的开始时间重叠。请注意,时间已合并;13:00-18:00和15:00-19:00的开始时间已合并为13:00-19:00的单一跨度。合并规则的标准是什么?为什么从输出中删除最后一项?您的输入是否按开始和结束时间排序?@VanPeer:因为时间与之前的开始时间重叠。请注意,时间已合并;13:00-18:00和15:00-19:00的开放时间已合并为13:00-19:00的单一跨度相关:。