【问题标题】:Python: iterate through two datetimes hourlyPython:每小时迭代两个日期时间
【发布时间】:2018-11-27 03:33:54
【问题描述】:

问题来了:

使用 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))

将生成 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

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

from datetime import datetime
  it = hourly_it( datetime(2018, 10, 2, 12), datetime(2018, 10, 3,12))
  print(next(it))

我收到此错误:

TypeError Traceback(最近调用 最后)

在 () 1 从日期时间导入日期时间 2 it = hourly_it(datetime(2018, 10, 2, 12), datetime(2018, 10, 3, 12))

----> 3 打印(下一个(它))

TypeError: 'function' 对象不是迭代器

我想通了。谢谢大家。这是不使用生成器的方法。我还应该注意,我把+1小时放在return之前并设置了start >=

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)

【问题讨论】:

  • 你的缩进不太对。你能清理一下你发布的代码吗?
  • 你的缩进还是错
  • 再次修复。谢谢。
  • 如果两个日期相隔超过 24 小时会发生什么?小时数应该重置还是应该继续计算超过 25 小时?
  • 我应该能够得到每小时的日期时间。例如,第 25 个日期戳是第二天的。

标签: python datetime


【解决方案1】:

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

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

The Iterator Protocol: How “For Loops” Work in Python

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

【讨论】:

  • yield 语句应该在添加小时之前发生;否则,这有可能返回结束日期时间之后的时间,因为while 检查发生在添加小时之前。
  • 是的,按“两个日期之间的小时数”计算...这只是我向他解释 python 的迭代器协议的方式。他仍然可以做功课。我可以做相反的事情(先让步),你仍然可以反过来指出同样的事情,所以我只是没有打扰
  • @PedroRodrigues。问题是,该语句使用了一个生成器,我也必须在下一个问题中解决它(是的,这是作业)。 from datetime import date, timedelta as td, datetime def hourly_gen( d1, d2) : while(d1
  • 至少你公开承担它的功课。我不会接触代码,你可能已经猜到了。迭代器协议已清楚地展示,使用您的示例(或我从您的问题中理解的内容)的决定只是一种简单的选择,任何其他示例都可以很好或更好地实现我正在寻找的东西,展示了迭代器协议。将作业带入堆栈溢出并没有错,只要尝试一下,暴露你的疑虑,并清楚这是作业,但不要指望人们为你做,如果发生这种情况你会很幸运。跨度>
  • 如果您对代码有任何疑问,请继续,我会澄清任何需要澄清的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多