我有两个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值,我建议您查看此页面上的选定答案。
答案 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))
。