2017-10-06 203 views
1

我试图通过用户输入的月份数来设置月份增加。例如,用户输入的日期为date = '2017-10-06',频率月份为FreqMonth=3如何在python中增加日期格式的月份

因此,我的工作是从日期date=2017-10-06生成3个月的日期。它会导致像这样:2017-10-062017-11-062018-10-06

我想我是这样的:

from datetime import datetime 

date = '2017-09-06' 
datelist = date.split('-') 
FreqMonth = 3 

for row in range(1,FreqMonth+1): 
    if row > 1: 
     datelist = newDate.split('-') 

    newMonth = int(datelist[1])+1 
    newDate = datetime.strptime(datelist[0] + '-' + str(newMonth) + '-' + datelist[2], '%Y-%m-%d') 
    newDate = newDate.strftime('%Y-%m-%d') 
    print newDate 

输出是:

2017-10-06 
2017-11-06 
2017-12-06 

它,工作得很好,但是如果我改变FreqMonth=5什么超过3个,我得到了错误

ValueError: time data '2017-13-06' does not match format '%Y-%m-%d'

Traceback (most recent call last): 
    File "DatePeriod.py", line 12, in <module> 
    newDate = datetime.strptime(datelist[0] + '-' + str(newMonth) + '-' + datelist[2], '%Y-%m-%d') 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 

我希望它的结果是:

2017-10-06 
2017-11-06 
2017-12-06 
2018-01-06 
2018-02-06 

我该如何做到这一点?谢谢。

回答

3

您可以使用dateutil扩展名,更具体地说可以使用relativedelta

你最终会得到这样的:

from datetime import datetime 
from dateutil.relativedelta import relativedelta 

date = datetime.strptime('2017-09-06', '%Y-%m-%d') 
FreqMonth = 5 

for month in range(1,FreqMonth+1): 
    newDate = date + relativedelta(months=month) 
    print(newDate) 
+0

有没有安装新的扩展名旁边任何其他方式,我试图避免使用第三方延期。谢谢。 –

+0

不是我知道对不起。举例来说,我认为手工做这件事会比闰年困难一些。 – yorah

+0

@yorah,谢谢。我尝试了你的答案。但它带有前导'00:00:00',我该如何删除它。我只想要年,月和日。谢谢。 –

0

尝试......避免第三方扩展

from calendar import monthrange 
from datetime import datetime, timedelta 

offset = datetime(2017, 9, 1) 

for i in range(29): 
    offset += timedelta(days=monthrange(offset.year, offset.month)[1]) 
    print(str(offset)) 
+0

在'offset = datetime(2017,9,30)上试试这段代码'我认为你有问题 –

+0

@ZhekaKoval,非常感谢:) –

相关问题