PYTHON 3.8 диапазон дат - PullRequest
       2

PYTHON 3.8 диапазон дат

2 голосов
/ 25 октября 2019

Я пытаюсь найти все даты между двумя датами, например: у меня есть две даты 2019-09-21 и 2019-10-09, как я могу получить все даты между такими:

2019-09-21
2019-09-22
2019-09-23
2019-09-24
....
....
2019-10-08
2019-10-09

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Код ниже может помочь вам.

from datetime import datetime, timedelta
start_date = datetime.strptime('2019-09-21', '%Y-%m-%d').date()
end_date = datetime.strptime('2019-10-09', '%Y-%m-%d').date()
while start_date <= end_date:
    print(start_date)
    start_date = start_date+timedelta(days=1)

Вывод

2019-09-21
2019-09-22
2019-09-23
2019-09-24
2019-09-25
2019-09-26
2019-09-27
2019-09-28
2019-09-29
2019-09-30
2019-10-01
2019-10-02
2019-10-03
2019-10-04
2019-10-05
2019-10-06
2019-10-07
2019-10-08
2019-10-09
1 голос
/ 25 октября 2019

Pythonic способ сделать это состоит в том, чтобы создать итератор, что-то вроде:

from datetime import datetime, timedelta

class dater(object):
    def __init__(self, first, lastPlusOne, inclusiveEnd = False):
        # Store important stuff, adjusting end if you want it inclusive.

        self.__oneDay = timedelta(days = 1)
        self.__curr = datetime.strptime(first, "%Y-%m-%d").date()
        self.__term = datetime.strptime(lastPlusOne, "%Y-%m-%d").date()
        if inclusiveEnd:
            self.__term += self.__oneDay

    def __iter__(self):
        return self

    def __next__(self):
        return self.next()

    def next(self):
        # This is the meat. It checks to see if the generator is
        # exhausted and raises the correct exception if so. If not,
        # it saves the current, calculates the next, stores that
        # for the next time, then returns the saved current.

        if self.__curr >= self.__term:
            raise StopIteration()

        (cur, self.__curr) = (self.__curr, self.__curr + self.__oneDay)
        return cur

Вы можете вызвать его как-то вроде (из вашего примера):

for date in dater("2019-09-21", "2019-10-09", inclusiveEnd=True):
    print(date)

дляget:

2019-09-21
2019-09-22
2019-09-23
2019-09-24
2019-09-25
: no need to show it all, trust me :-)
2019-10-08
2019-10-09

Преимущество использования итератора состоит в том, что:

  • код для его использования становится очень простым for циклом, похожим на многие другие методы Python;и
  • вы можете сделать конструктор __init__ произвольно сложным (например, принимая переменные datetime или date, а также текущие строки).

Эта последняя точканесет некоторые дополнительные объяснения. В коде, который устанавливает self.__curr (например), вы можете использовать что-то вроде этого:

if type(first) == type(date(2000, 1, 1)):        # copy a date.
    self.__curr = first
elif type(first) == type(datetime(2000, 1, 1)):  # extract date from datetime.
    self.__curr = first.date()
else:                                            # convert string.
    self.__curr = datetime.strptime(first, "%Y-%m-%d").date()

Это будет определять тип источника и корректировать поведение, так что вы получите date независимо от этого. Если вы сделаете то же самое для окончательной даты, вы получите действительно адаптируемый итератор, который может даже начинаться и заканчиваться различными представлениями:

for mydate in dater("2000-01-01", datetime.now()):
    process_every_date_from_start_of_2000_to_yesterday(mydate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...