如何生成一系列yyyymm值?

时间:2015-01-20 09:54:07

标签: python

我有两个yyyymm值将由用户输入:

yyyymm_1 = '201406'
yyyymm_2 = '201501'

我希望能够以递增的月份顺序遍历此范围:

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

如何在python中完成?


更新:

理想情况下,解决方案应尽可能简单,无需外部库。我不是在寻找通用的日期操作解决方案,而是一个解决我上面提到的具体问题的解决方案。

在发布我的问题之前,我见过很多通用解决方案。然而,作为一个蟒蛇菜鸟,无法看到如何使它们适应我的问题:

就此而言,与此页面相关的其他问题更为通用。如果您要生成一系列yyyymm值,我建议您查看此页面上的选定答案。

2 个答案:

答案 0 :(得分:3)

您可以使用内置datetime模块和第三方软件包dateutil来执行此操作。

代码首先使用datetime.datetime.strptime将字符串转换为datetime.datetime个对象。然后,它使用dateutil中的relativedelta函数创建一个月的期间,可以添加到您的日期时间。

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

答案 1 :(得分: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))