Как найти пропуски по заданному количеству объектов «время начала» и «конец»? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть пары объектов DateTime.Каждый объект DateTime является либо «началом», либо «концом» временного диапазона.Иногда временные диапазоны перекрываются.Мне нужно найти пробелы.

Я попробовал модуль DateTimeRange отключить pypi, протестировать пересекающиеся диапазоны и затем построить охватываемые диапазоны (согласно их документации), но я не смог собрать эти компоненты в частькод, который делает то, что я хочу

РЕДАКТИРОВАТЬ: «разрыв» в этом случае определяется как любой промежуток времени между самым ранним «началом» и самым последним «концом», который не охватывается одной из паробъекты 'start' и 'end' 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)}]

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете сортировать диапазоны по времени начала, а затем отслеживать время окончания, пока не найдете разрыв между временем окончания и временем следующего запуска.Если вы обнаружите этот пробел, вы добавите его.Вам необходимо заранее указать время окончания, если время следующего окончания больше текущего времени окончания.

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)}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...