Как остановить цикл для текущего значения месяца и года в Python

В настоящее время у меня есть код следующим образом:

   mon = datetime.date.today().strftime("%m")
   month = int(mon)
   yy = datetime.date.today().strftime("%Y")
   year = int(yy)
   print year

   for state_fips in (4,5,6):
       for year in range(1993, year+1):
           for j in range(1,13):
               yearMonth1 = year,j,state_fips
               yearMonth = year,j
               print yearMonth1
           if (yearMonth) == (year,month):
               break

Он печатает ответ как:

(1993, 1, 4)
(1993, 2, 4)
(1993, 3, 4)...,,
(1993, 1, 5)
(1993, 2, 5)
(1993, 3, 5),,
(2017, 12, 6)

Как сделать это для конца цикла в 2017 / 03 году, то есть в текущем месяце и году, а не в конце 2017 года?

1 ответ

Решение

Прежде всего, вы слишком усложняете извлечение текущего года и месяца. Просто используйте year а также month атрибуты date объект, возвращенный datetime.date.today():

today = datetime.date.today()
# in the loop we'll use (today.year, today.month)

В вашем цикле вы сделали две ошибки: вы использовали повторно year (маскируя значение текущего года), и вы ставите if оператор в годовой петле, а не в месячной петле, поэтому последняя продолжается до 12, всегда.

Вам придется проверить month переменная в самом внутреннем цикле, а не во внешнем цикле года, относительно правильного значения текущего года. Внешний цикл естественным образом заканчивается в текущем году:

today = datetime.date.today()

for state_fips in (4,5,6):
    for year in xrange(1993, today.year + 1):
        for month in xrange(1,13):
            yearMonth1 = year, month, state_fips
            print yearMonth1
            # break out of month loop if this month is reached
            if (year, month) == (today.year, today.month):
                break

Поскольку вы используете Python 2, я заменил range()звонки с xrange() чтобы избежать создания списков только для итерации.

Вы могли бы использовать itertools.product Функция для создания одного цикла:

from itertools import product:

today = datetime.date.today()

years, months = xrange(1993, today.year + 1), xrange(1, 13)
for state_fips, year, month in product((4, 5, 6), years, months):
    yearMonth1 = year, month, state_fips
    print yearMonth1
    # break out of month loop if this month is reached
    if (year, month) == (today.year, today.month):
        break
Другие вопросы по тегам