解决:按月计​​算Python循环时间

时间:2019-03-05 19:01:15

标签: python loops debugging time

我正在创建一个Python程序来打印两个数字。这两个数字都是yyyymm格式的整数。第二个数字与第一个数字相距11个月。我正在尝试遍历一个时间范围以打印它们。例如,这是理想的结果:

201101 201112
201102 201201
201103 201202
201104 201203
...
201312 201411

目前,我有一个程序如下:

import time
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)  
        yield y, m + 1              

for y, m in iter_months('201101', '201312'):
    start = ("%d%02d" % (y, m))
    end = int((datetime.datetime.strptime(str(start), '%Y%m') + relativedelta(month=+11)).strftime('%Y%m'))
    print start, end

但是,如下面的结果所示,它无法正常工作。第二栏中的月份是固定的。

201101 201111
201102 201111
201103 201111
201104 201111
201105 201111
201106 201111
201107 201111
201108 201111
201109 201111
201110 201111
201111 201111
201112 201111
201201 201211
201202 201211
201203 201211
201204 201211
201205 201211
201206 201211
201207 201211
201208 201211
201209 201211
201210 201211
201211 201211
201212 201211
201301 201311
201302 201311
201303 201311
201304 201311
201305 201311
201306 201311
201307 201311
201308 201311
201309 201311
201310 201311
201311 201311
201312 201311

我无法弄清楚出什么问题了...因为当我单独运行relativedelta函数时,它可以很好地工作。

有人可以在这里帮忙吗?预先感谢。

编辑: 我在程序中发现了我的错误。它应该是relativedelta(month s = + 11))。我以前错过了's'。

1 个答案:

答案 0 :(得分:1)

您可以使用relativedelta并创建如下函数:

from datetime import datetime
from dateutil.relativedelta import relativedelta

def add_months(start, no_months):

    start = datetime.strptime(start, '%Y%m')

    delta = relativedelta(months=+no_months)

    end = datetime.strftime(start + delta, '%Y%m')

    return end

add_months('201101', 11)

返回的值是:

201112

然后您可以使用pandas应用此功能:

import pandas as pd

start_dates = ['201101', '201102', '201103', '201104', '201105', '201106', '201107', '201108', '201109', '201110', '201111', '201112', '201201']

df = pd.DataFrame({'Start': start_dates})

df['End'] = df['Start'].apply(add_months, args=(11,))

收益:

     Start     End
0   201101  201112
1   201102  201201
2   201103  201202
3   201104  201203
4   201105  201204
5   201106  201205
6   201107  201206
7   201108  201207
8   201109  201208
9   201110  201209
10  201111  201210
11  201112  201211
12  201201  201212