Python: итерация по двум датам каждый час - PullRequest
0 голосов
/ 27 ноября 2018

Вот вопрос:

Используя модуль datetime в python, создайте итератор, который генерирует все часы между двумя объектами datetime.datatime.

it = hourly_it( d1, d2) # где d1 и d2 являются datetime.datetime объектами.Например,

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

будет генерировать все даты с 12:00 (полдень) 2 ноября до 12:00 (полдень) 3 ноября.

Вот мой код:

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 (последний вызов последнего)

in () 1 из datetime импорта datetime 2 it = hourly_it (datetime (2018, 10, 2, 12), datetime (2018, 10, 3, 12))

----> 3 print (следующий (это))

TypeError: объект 'function' не является итератором

Я понял это.Спасибо всем.Вот как вы делаете это без использования генератора.Я также должен отметить, что я поставил + 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)

1 Ответ

0 голосов
/ 27 ноября 2018

Я почти уверен, что это школьная работа, которую вы там сделали.

Но я дам вам немного прочтения протокола итератора python, и короткий и приятный пример, возможно, вы его получите;и все равно это не ракетостроение.

Протокол итератора: как работает «для циклов» в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...