我正在创建一个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'。
答案 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