Как остановить цикл для текущего значения месяца и года в 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