首页 > 解决方案 > 在python中查找重叠的时间段

问题描述

我有两个不同类型的“事件”(listA 和 listB)的列表,每个事件都有一个发生的时间段(存储为开始时间和持续时间,以秒为单位),我想从 listA 中查找所有事件这与 listB 中发生的任何事件同时发生。

这些事件不需要在完全相同的时间和相同的持续时间内发生,如果有任何时间重叠将被计算在内。此外,列表列表中没有重叠,在任何给定的秒内,最多有一个来自 listA 的事件和一个来自 listB 的事件正在运行。最后,listB 中的所有事件都必须发生在来自 listA 的事件中(它可以与 listA 中的事件同时开始和结束,但不能在它之前开始或在它之后结束)。换句话说,所有 listB 事件都完全包含在 listA 事件中,而 listA 事件必须0包含n在其中的 listB 事件。

现在,我想我可以为 listB 中的每个项目与 listA 中的每个项目做一个集合交集,但这似乎真的效率低下,有没有找到所有这些重叠的有效方法?

样品清单:

listA=[
    {
      "duration": 3600,
      "starttime": "1/31/2019 5:00",
      "listAData": "..."
    },
    {
     "duration": 1800,
     "starttime": "1/31/2019 7:00"
     "listAData": "..."
    },
    {...},
  ]
listB=[
    {
      "duration": 1800,
      "starttime": "1/31/2019 5:15",
      "listBData": "..."
    },
    {
     "duration": 60,
     "starttime": "2/1/2019 23:00"
     "listBData": "..."
    }
  ]

所以在这个例子中 ,我会得到 A1 和 A3(因为它们分别与 B1 和 B2 重叠),而 A2 将被忽略。

我也不关心 A1 是否与多个 B 对象重叠,所以我真的只需要与至少一个 listB 事件同时发生的所有 listA 事件的列表,或者它们的索引列表等。

标签: python

解决方案


这是一段代码,显示了我(很久以前)编写的一个相当通用的类。这并不多,但希望它至少可以为您提供一个开发自己的起点。

class Interval(object):
    # Representation of a closed interval.
    # a & b can be numeric, dates, or any other object type than can be
    # compared. if the type can also be incremented by 1, then it will be
    # possible to iterate between the two values in ascending order.
    def __init__(self, a, b):
        #self.lowerbound, self.upperbound = min(a, b), max(a, b)
        #self.lowerbound, self.upperbound = sorted([a, b])  # Py v2.4
        self.lowerbound, self.upperbound = (a, b) if a < b else (b, a)  # Py v2.5

    def __contains__(self, val):
        return self.lowerbound <= val <= self.upperbound

    # Implemented as a generator (so no 'next' method needed)
    def __iter__(self):
        nextvalue = self.lowerbound  # initialize iteration state
        while nextvalue <= self.upperbound:
            yield nextvalue
            nextvalue += 1

推荐阅读