首页 > 解决方案 > 尝试将秒、分、小时作为可选的“datetime.datetime”返回

问题描述

我想将 timedelta 与产量一起使用,这是我的脚本:

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

标签: pythonyieldtimedelta

解决方案


如果我的问题是正确的 - 你想要的是一个生成器,它产生datetime一定范围内的日期(对象),并且在每个连续日期之间有一定的增量。

问题是您generator通过while True. 这意味着如果您尝试将其强制转换为 a list,则会出现内存异常,因为列表不是无限的......

您可以做的是引入一个end_date(在哪里停止)并while用一个for循环替换循环,该循环遍历应该完成的所有增量:

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只会在您调用生成器的下一个元素时执行。

您也可以使用 a 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再次陷入陷阱。


推荐阅读