Вы хотели бы создать datetime.time()
объекты, а затем сделать последовательность циклической с itertools.cycle()
и объединить эти с datetime.date
объекты :
import datetime
from itertools import cycle, product, repeat
from bisect import bisect
def datetime_series(*timestrings, reference=None):
times = sorted(datetime.time(*map(int, t.split(':'))) for t in timestrings)
if reference is None:
reference = datetime.datetime.now()
date, tnow = reference.date(), reference.time()
next_pos = bisect(times, tnow) # index of next time object to use
times = cycle(times + [None])
for _ in range(next_pos): # skip forward across the time objects
next(times)
for time in times:
if time is None:
# next day
date += datetime.timedelta(days=1)
time = next(times)
yield datetime.datetime.combine(date, time)
Выше используется None
в качестве часового, чтобы определить, что значение даты должно быть увеличено на шаг, а строки времени приняты в качестве отдельных аргументов, и вы можете передать другую контрольную дату (по умолчанию используйте сейчас ).
Это также бесконечный генератор, так что вы можете перебирать его шаг за шагом или использовать itertools.slice()
, чтобы ограничить количество результатов.
Лично я бы изменил, чтобы функция принимала datetime.time()
объекты, а не передавала строки, поэтому вы просто сортируете аргументы без необходимости разбора и перехода оттуда.
Демо-версия:
>>> from itertools import islice
>>> from pprint import pprint
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 10, 30, 17, 39, 46, 91967)
>>> m = datetime_series('8:15', '14:28', '19:43', '1:21')
>>> next(m)
datetime.datetime(2018, 10, 30, 19, 43)
>>> next(m)
datetime.datetime(2018, 10, 31, 1, 21)
>>> m = datetime_series('8:15', '14:28', '19:43', '1:21')
>>> ten_results = list(islice(m, 10))
>>> pprint(ten_results)
[datetime.datetime(2018, 10, 30, 19, 43),
datetime.datetime(2018, 10, 31, 1, 21),
datetime.datetime(2018, 10, 31, 8, 15),
datetime.datetime(2018, 10, 31, 14, 28),
datetime.datetime(2018, 10, 31, 19, 43),
datetime.datetime(2018, 11, 1, 1, 21),
datetime.datetime(2018, 11, 1, 8, 15),
datetime.datetime(2018, 11, 1, 14, 28),
datetime.datetime(2018, 11, 1, 19, 43),
datetime.datetime(2018, 11, 2, 1, 21)]
>>> question_1 = datetime.datetime(2008, 7, 31, 21, 26, 37) # https://meta.stackexchange.com/a/30138
>>> question_1_series = datetime_series('8:15', '14:28', '19:43', '1:21', reference=question_1)
>>> pprint(list(islice(question_1_series, 10)))
[datetime.datetime(2008, 8, 1, 1, 21),
datetime.datetime(2008, 8, 1, 8, 15),
datetime.datetime(2008, 8, 1, 14, 28),
datetime.datetime(2008, 8, 1, 19, 43),
datetime.datetime(2008, 8, 2, 1, 21),
datetime.datetime(2008, 8, 2, 8, 15),
datetime.datetime(2008, 8, 2, 14, 28),
datetime.datetime(2008, 8, 2, 19, 43),
datetime.datetime(2008, 8, 3, 1, 21),
datetime.datetime(2008, 8, 3, 8, 15)]