2015-01-20 2 views
1

У меня есть два значения YYYYMM, которые будут вводиться пользователем:Как создать диапазон значений yyyymm?

yyyymm_1 = '201406' 
yyyymm_2 = '201501' 

Я хочу, чтобы иметь возможность перебирать этот диапазон в увеличении месяц заказа:

for yyyy and mm in the range of yyyymm_1 to yyyymm_2 
    my_function(yyyy, mm) 

Как это может быть сделано в питон?


Update:

В идеале, решение должно быть как можно более простым, не требуя внешних библиотек. Я не ищу универсальное решение для управления датами, но решение для ответа на конкретный вопрос, который я задал выше.

Перед публикацией моего вопроса я видел множество общих решений. Однако, будучи питон нуб, не мог видеть, как адаптировать их к моему вопросу:

На этой ноте, другие вопросы, связанные с с этой страницы гораздо более общий. Если вы хотите создать диапазон значений yyyymm, я настоятельно рекомендую вам посмотреть выбранный ответ на этой странице.

+1

Что вы попробовали? Кстати, [вопрос, подобный этому] (https://stackoverflow.com/q/28035042/2476444) появился менее 2 дней назад. Вы искали похожие вопросы на основе ключевых слов? –

+0

http://stackoverflow.com/a/1060352/1673391 –

+0

Этот вопрос и выбранный ответ явно отличаются от других вопросов и ответов. В этом вопросе конкретно задается вопрос о том, как создать набор значений yyyy и mm из диапазонов дат yyyy mm. Я не мог найти никаких вопросов, которые задают то же самое, что и этот вопрос. –

ответ

3

Вот еще один довольно простой вариант, даже без использования datetime. Просто разделите дату, вычислите «общий месяц» и выполните итерацию.

def to_month(yyyymm): 
    y, m = int(yyyymm[:4]), int(yyyymm[4:]) 
    return y * 12 + m 

def iter_months(start, end): 
    for month in range(to_month(start), to_month(end) + 1): 
     y, m = divmod(month-1, 12) # ugly fix to compensate 
     yield y, m + 1    # for 12 % 12 == 0 

for y, m in iter_months('201406', '201501'): 
    print y, m 

Выход:

2014 6 
2014 7 
... 
2014 12 
2015 1 

Для вывода в том же формате yyyymm, использовать print("%d%02d" % (y, m)).

+1

. Месяцы равны нулю на основе этого решения, как они могут быть один на основе? –

+0

@ChrisSnow Whops, вы правы, я пропустил это. Должно быть исправлено сейчас. –

4

Вы можете сделать это, используя встроенный модуль datetime и сторонний пакет dateutil.

Код сначала преобразует ваши строки в datetime.datetime объектов с использованием datetime.datetime.strptime. Затем он использует функцию relativedelta от dateutil, чтобы создать период в один месяц, который можно добавить к вашим датам.

В while петли вы можете работать с datetime объектами непосредственно, или построить месяц и год в виде строк с использованием strftime, я показал пример, как в функции печати.

import datetime as dt 
from dateutil.relativedelta import relativedelta 

yyyymm_1 = '201406' 
yyyymm_2 = '201501' 

MONTH = relativedelta(months=+1) 

fmt = '%Y%m' 
date_1 = dt.datetime.strptime(yyyymm_1, fmt).date() 
date_2 = dt.datetime.strptime(yyyymm_2, fmt).date() 

d = date_1 

while d <= date_2: 
    print(d) 
    print(d.strftime('%Y'), d.strftime('%m')) 

    d += MONTH 
Смежные вопросы