Попытка вернуть se c, min, hour как выбираемое «datetime.datetime» с доходностью - PullRequest
2 голосов
/ 28 апреля 2020

Я хочу использовать timedelta с yield, вот мой сценарий:

def date_range(start_date,count_type):

    time_values = {"hour": 60 * 60, "minute": 60, "second": 1}

    increment_value = time_values[count_type]

    while True:
        yield start_date + datetime.timedelta(seconds=increment_value)

no=list(date_range(datetime.datetime(2020,4,28),"second"))

for z in no:

    print(no)

Когда я запускаю сценарий, я не получаю никакого ответа от терминала запуска, знаете, почему?

Редактировать: Через некоторое время я получил это как ответ

 Traceback (most recent call last):
  File "C:/U----/Desktop/countertypefunc.py", line 197, in <module>
    no=list(date_range(datetime.datetime(2020,4,28),"second"))
MemoryError

1 Ответ

1 голос
/ 29 апреля 2020

Если я правильно понял вопрос - вам нужен генератор, который выдает даты (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.

...