Python:每小时迭代两个日期时间

Ste*_*wer 4 python datetime

这是问题:

使用 python 的 datetime 模块,创建一个迭代器,生成两个 datetime.datatime 对象之间的所有小时。

it = hourly_it( d1, d2)# 其中d1d2datetime.datetime对象。例如,

from datetime import datetime
it = hourly_it( datetime(2018, 10, 2, 12), datetime(2018, 10, 3, 12))
Run Code Online (Sandbox Code Playgroud)

将生成 11 月 2 日 12:00(中午)到 11 月 3 日 12:00(中午)之间的所有日期时间。

这是我的代码:

from datetime import date, timedelta as td, datetime
   def hourly_it( d1, d2) :
      start = d1
      finish = d2
      def f():
         nonlocal start, finish
         if(start>=finish): return None
         start += td(hours=1)
         return start   
      return f
Run Code Online (Sandbox Code Playgroud)

当我使用以下方法测试代码时:

from datetime import datetime
  it = hourly_it( datetime(2018, 10, 2, 12), datetime(2018, 10, 3,12))
  print(next(it))
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

TypeError Traceback(最近一次调用最后一次)

in () 1 from datetime import datetime 2 it = hourly_it( datetime(2018, 10, 2, 12), datetime(2018, 10, 3, 12))

----> 3 print(下一个(it))

类型错误:“函数”对象不是迭代器

我想到了。谢谢大家。这是不使用生成器的方法。我还应该注意,我在返回前放置了 +1 小时并设置了开始 >=

from datetime import date, timedelta as td, datetime
  def hourly_it( d1, d2) :
     start = d1
     finish = d2
     def f():
          nonlocal start, finish
          if(start>=finish): return None
          start += td(hours=1)
          return start

      return iter(f,None)
Run Code Online (Sandbox Code Playgroud)

Ped*_*ues 5

我几乎可以肯定这是你的学校作业。

\n\n

但我会给你一些关于 python 迭代器协议的读物,以及简短而有趣的例子,也许你会明白;无论如何,这不是火箭科学。

\n\n

迭代器协议:\xe2\x80\x9cFor Loops\xe2\x80\x9d 如何在 Python 中工作

\n\n
>>> from datetime import datetime, timedelta\n>>> def hourly_it(start, finish):\n...     while finish > start:\n...             start = start + timedelta(hours=1)\n...             yield start\n>>> start = datetime(2018, 10, 2, 12)\n>>> finish = datetime(2018, 10, 3, 12)\n>>> for hour in hourly_it(start, finish):\n...     print(hour)\n...\n2018-10-02 13:00:00\n2018-10-02 14:00:00\n2018-10-02 15:00:00\n2018-10-02 16:00:00\n2018-10-02 17:00:00\n2018-10-02 18:00:00\n2018-10-02 19:00:00\n2018-10-02 20:00:00\n2018-10-02 21:00:00\n2018-10-02 22:00:00\n2018-10-02 23:00:00\n2018-10-03 00:00:00\n2018-10-03 01:00:00\n2018-10-03 02:00:00\n2018-10-03 03:00:00\n2018-10-03 04:00:00\n2018-10-03 05:00:00\n2018-10-03 06:00:00\n2018-10-03 07:00:00\n2018-10-03 08:00:00\n2018-10-03 09:00:00\n2018-10-03 10:00:00\n2018-10-03 11:00:00\n2018-10-03 12:00:00\n
Run Code Online (Sandbox Code Playgroud)\n

  • Yield 语句应该在添加小时之前发生;否则,这有可能返回超过完成日期时间的时间,因为“while”检查发生在添加小时之前。 (2认同)