python вложенные циклы while и datetime

#python #datetime #python-3.7

#python #datetime #python-3.7

Вопрос:

Я сам учу python для ATBS. Вместо того, чтобы тратить 45 минут на ввод множества повторяющихся данных в Excel, я потратил последние 90, не сумев написать простой сценарий календаря.

Начиная со значений «2012-09-01» и «2012-09-30», я хочу, чтобы каждая строка увеличивала значение месяца на 1, оно достигает 12, и в этот момент значение года увеличивается на 1, до даты 2018-12-31.

например

«2012-09-01 2012-09-30
2012-10-01 2012-10-31
2012-11-01 2012-11-30
2012-12-01 2012-12-31»

Вот мой код, который останавливается на 2012-12-31.

 import datetime

year = 2012
month = 9
day_start = 1
day_end = 31

while year <= 2018:
    while month <= 12:
        if month == 4 or month == 6 or month == 9 or month == 11:
            day_end = 30
        else:
            day_end = 31
        print(datetime.date(year, month, day_start), " ", datetime.date(year, month, day_end))
        month = month   1
year = year   1
  

Любая помощь очень ценится!

Комментарии:

1.2012-09-01 2012-09-30 2012-10-01 2012-10-31 2012-11-01 2012-11-30 2012-12-01 2012-12-31

2. И как вы справляетесь с февралем?

3. взгляните на dateutil relativedelta или pandas date_range .

4. Что такое аббревиатура ATBS?

5. ATBS = Автоматизировать скучные вещи

Ответ №1:

Проверьте это. Использование calendar библиотеки для определения високосных лет.

 import datetime
import calendar

year = 2012
month = 9
day_start = 1
day_end = 31

while year <= 2018:
    while month <= 12:
        if month == 4 or month == 6 or month == 9 or month == 11:
            day_end = 30
        elif month == 2:
            day_end = 29 if calendar.isleap(year) else 28
        else:
            day_end = 31
        print(datetime.date(year, month, day_start), " ", datetime.date(year, month, day_end))
        month = month   1
    year = year   1
    month = 1
  

Строка

 if month == 4 or month == 6 or month == 9 or month == 11:
  

может быть сокращено до:

 if month in (4, 6, 9, 11):
  

Комментарии:

1. Это именно то, что я искал. Я ценю приведенные выше предложения о timedelta и т. Д., Но очень полезно использовать мой существующий код, чтобы я мог видеть, что происходит.

2. Когда я смотрю на то, что вы написали, становится понятно, почему он остановился на своих дорожках. Мне нужно было сбросить значение месяца до 1, если я хотел, чтобы оно началось снова в следующем году. Спасибо!