2014-10-03 31 views
2

我有一個開始日期datetime(2015, 01, 01),我希望我的程序能夠在每個步驟前進到下一個月的第一個月,但它將執行此操作幾十年,但需要排除故障它只是做了一年。它在while循環中的原因是因爲我還希望它根據月份和年份進行一些報廢。這是我的代碼,我已經寫了:以Python爲單位的timedelta在幾個月內步進日期

import datetime 

dayS = 01; monthS = 01; yearS = 2015 #Start date 
dayE = 01; monthE = 01; yearE = 2016 #End date 
SDate = datetime.date(yearS, monthS, dayS) 
EDate = datetime.date(yearE, monthE, dayE) 
Date = [] 

while SDate <= EDate: 
     Date.append(SDate.strftime('%d/%m/%Y')) 
     if SDate.strftime('%m') == '02': 
       step = datetime.timedelta(days=28) 
     if SDate.strftime('%m') == '09' or '04' or '06' or '11': 
       step = datetime.timedelta(days=30) 
     if SDate.strftime('%m') == '01' or '03' or '05' or '07' or '08' or '10' or '12': 
       step = datetime.timedelta(days=31) 
     SDate += step 

print Date 

但我得到的結果是['01/01/2015', '01/02/2015', '04/03/2015', '04/04/2015', '05/05/2015', '05/06/2015', '06/07/2015', '06/08/2015', '06/09/2015', '07/10/2015', '07/11/2015', '08/12/2015'],正如你可以看到一些個月它不添加天的正確的金額。

任何幫助非常感謝!

+0

mgilson已經正確識別了上面的代碼的問題,但我會重新做一點,以減少自己的工作。給定任意日期,'(somedate.replace(day = 1)+ datetime.timedelta(days = 31))。replace(day = 1)'總是下個月的第一天。如果你知道你只從本月的第一天開始,你可以跳過第一個'replace'。或者有像dateutil這樣的第三方庫可以提供幫助。 – 2014-10-03 19:46:30

回答

4

你有什麼是經典的「或」問題。

"foo" == "1" or "2" 

總是返回True,因爲它被解析爲:

("foo" == "1") or "2" 
     |   | 
     False or "2" 
       | 
       "2" 

注意,在這種情況下,你可能會更好使用datetime.date.replace

while SDate <= EDate: 
    if SDate.month < 12: 
     SDate = SDate.replace(month=SDate.month + 1) 
    else: 
     SDate = SDate.replace(month=1, year=SDate.year + 1) 
相關問題