Если я правильно понял вопрос - вам нужен генератор, который выдает даты (datetime
объекты) в определенном диапазоне и с определенным шагом между каждой последовательной датой.
Проблема в том, что вы создать бесконечное generator
с помощью while True
. Это означает, что если вы попытаетесь привести его к list
, вы получите исключение памяти, так как списки не бесконечны ...
Что вы можете сделать, это ввести end_date
(где остановиться) и замените while
l oop на for
l oop, который повторяет все приращения, которые должны быть выполнены:
import datetime
def date_range(start_date, end_date, count_type="second"):
# determine the increment
time_values = {"hour": 60 * 60, "minute": 60, "second": 1}
incr = time_values[count_type]
# determine the number of iterations / increments to be done
n = int((end_date-start_date).total_seconds()) // incr
# iterate...
for i in range(n):
yield start_date + datetime.timedelta(seconds=incr*i)
t0, t1 = datetime.datetime(2020, 4, 28), datetime.datetime(2020, 4, 29)
for d in date_range(t0, t1, "hour"):
print(d)
# prints
# 2020-04-28 00:00:00
# 2020-04-28 01:00:00
# 2020-04-28 02:00:00
# ...
# 2020-04-28 21:00:00
# 2020-04-28 22:00:00
# 2020-04-28 23:00:00
Поскольку вы используете yield
, каждая итерация for
l oop будет выполняться только при вызове следующего элемента генератора.
Вы также можете использовать while True
, например,
def date_range2(start_date, count_type="second"):
time_values = {"hour": 60 * 60, "minute": 60, "second": 1}
i = 0
while True:
i += 1
yield start_date + datetime.timedelta(seconds=time_values[count_type]*i)
t0 = datetime.datetime(2020, 4, 28)
f = date_range2(t0)
for i in range(10):
print(next(f))
# prints
# 2020-04-28 00:00:01
# 2020-04-28 00:00:02
# 2020-04-28 00:00:03
# ...
# 2020-04-28 00:00:08
# 2020-04-28 00:00:09
# 2020-04-28 00:00:10
... но быть Будьте осторожны при использовании этой функции. Вы должны использовать next()
, чтобы получить следующий элемент из generator
- если вы попытаетесь list(f)
, вы снова попадете в ловушку while True
.