尝试 return 秒、分钟、小时作为可选 "datetime.datetime" 和产量
Trying to return sec, min, hour as choosable "datetime.datetime" with yield
我想使用 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
如果我答对了 - 你想要的是一个生成日期(datetime
对象)在一定范围内并且在每个连续日期之间有一定增量的生成器。
问题是您通过 while True
创建了无限 generator
。这意味着,如果您尝试将其转换为 list
,则会出现内存异常,因为列表不是无限的...
你可以做的是引入一个 end_date
(在哪里停止)并用一个 for
循环替换 while
循环,该循环遍历所有应该完成的增量:
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
循环的每次迭代只会在您调用生成器的下一个元素时执行。
您也可以使用 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
陷阱。
我想使用 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
如果我答对了 - 你想要的是一个生成日期(datetime
对象)在一定范围内并且在每个连续日期之间有一定增量的生成器。
问题是您通过 while True
创建了无限 generator
。这意味着,如果您尝试将其转换为 list
,则会出现内存异常,因为列表不是无限的...
你可以做的是引入一个 end_date
(在哪里停止)并用一个 for
循环替换 while
循环,该循环遍历所有应该完成的增量:
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
循环的每次迭代只会在您调用生成器的下一个元素时执行。
您也可以使用 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
陷阱。