我有几对DateTime对象。每个DateTime对象都是时间范围的“开始”或“结束”。时间范围有时会重叠。我需要找出差距。
我在pypi上尝试了DateTimeRange模块,测试相交范围,然后构造包含范围(根据他们的文档),但我无法将这些组件构建成我想要的一段代码
编辑:在这种情况下,“间隔”被定义为最早的“开始”和最近的“结束”之间不包含在“开始”和“结束”DateTime对象对之一中的任何一段时间
import dateparser
from pprint import pprint
foo = []
foo.append({
"start": dateparser.parse("8:00 AM"),
"end": dateparser.parse("8:06 AM")
})
foo.append({
"start": dateparser.parse("8:03 AM"),
"end": dateparser.parse("8:07 AM")
})
foo.append({
"start": dateparser.parse("8:02 AM"),
"end": dateparser.parse("8:16 AM")
})
foo.append({
"start": dateparser.parse("8:20 AM"),
"end": dateparser.parse("8:30 AM")
})
pprint(foo)
#[{'end': datetime.datetime(2019, 2, 15, 8, 6),
# 'start': datetime.datetime(2019, 2, 15, 8, 0)},
# {'end': datetime.datetime(2019, 2, 15, 8, 7),
# 'start': datetime.datetime(2019, 2, 15, 8, 3)},
# {'end': datetime.datetime(2019, 2, 15, 8, 16),
# 'start': datetime.datetime(2019, 2, 15, 8, 2)},
# {'end': datetime.datetime(2019, 2, 15, 8, 30),
# 'start': datetime.datetime(2019, 2, 15, 8, 20)}]
find_gaps(foo)
#desired output
#
#[{'end': datetime.datetime(2019, 2, 15, 8, 20),
# 'start': datetime.datetime(2019, 2, 15, 8, 16)}]发布于 2019-02-16 00:52:41
您可以根据开始时间对范围进行排序,然后跟踪结束时间,直到找到一个结束时间和下一个开始时间之间的间隔。如果你找到了那个空白点,你就把它附加上去。如果下一个结束时间大于当前结束时间,则需要提前结束时间。
def find_gaps(ranges):
if len(ranges) <= 1:
return []
# sort by start times
ranges = sorted(ranges, key=lambda x:x['start'])
gaps = []
# Start at the end of the first range
now = ranges[0]['end']
# Iterate through ranges, ignoring the first range
for pair in ranges[1:]:
# if next start time is before current end time, keep going until we find a gap
# if next start time is after current end time, found the first gap
if pair['start'] > now:
gaps.append({
'start':now,
'end':pair['start']
})
# need to advance "now" only if the next end time is past the current end time
now = max(pair['end'], now)
return gaps输出:
[{'end': datetime.datetime(2019, 2, 15, 8, 20),
'start': datetime.datetime(2019, 2, 15, 8, 16)}]https://stackoverflow.com/questions/54713564
复制相似问题