python - 如何在给定多个 'start' 和 'end' 日期时间对象的情况下查找间隙?

标签 python datetime

我有一对 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)}]

最佳答案

您可以根据开始时间对范围进行排序,然后跟踪结束时间,直到找到结束时间和下一个开始时间之间的间隔。如果你发现那个差距,你追加它。如果下一个结束时间大于当前结束时间,则需要提前结束时间。

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)}]

关于python - 如何在给定多个 'start' 和 'end' 日期时间对象的情况下查找间隙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54713564/

相关文章:

python - 在 Windows 上使用 git-remote-hg

python - 将 CSV 的唯一第 0 个元素分组为 python 或 hive 中唯一的第 i 个元素

python - 在数据帧python中按时间步长在开头添加一个值

mysql - 如何对查询中的最大值求和,例如总和(最大值(值))

Python 字典故障安全

python - 测试失败的 ndb 事务

python - 在知道这些线条的角度的情况下,在质量很差的图像上找到线条的最佳方法是什么?

android - 将事件添加到日历显示错误的结束日期

datetime - 在 SSIS 中将日期转换为当前月份名称的字符串?

pandas - 基于 Pandas DataFrame 中特定日期时间值的聚合函数