2017-03-08 80 views
2

我遇到了一些我一直在編寫的代碼的問題。我接受四次輸入(日,月和年)作爲日期,以及他們想要重複執行任務的次數(例如每週一3周)。該代碼是巨大的但如果周月之間有所不同,我得到這個錯誤:ValueError:日期超出月份datetime的範圍

File "C:\Users\dansi\AppData\Local\Programs\Python\Python36-32\gui test 3.py", line 72, in addtimeslot 
fulldateadd = datetime.date(year, month, day) 
ValueError: day is out of range for month 

的代碼部分是相關的:

for i in range(0 , times): 
    fulldateadd = datetime.date(year, month, day) 
    cursor.execute('''INSERT INTO dates (Date, Name, Start, End) VALUES(?,?,?,?);''', (fulldateadd , name1, starttimehour, endtimehour)) 
    day = day + 7 
    if day > 31: 
     month = month + 1 

我試圖遞增月時的天數超過31,但它似乎沒有工作。

+0

你沒有在任何地方回零通過零.. – miradulo

+0

這是一個觀點。我將如何去編碼?我假設它發現剩餘,但我不知道該怎麼做。感謝您的回覆 – simons21

+0

使用循環內的timedelta遞增日期時間,而不是在每次迭代時嘗試構造新的日期時間。 – miradulo

回答

1

爲什麼增加日期時間的組件然後創建新日誌並不是一個好主意。主要是因爲你自己處理公曆是不是令人愉快的恕我直言,日期時間對象可以爲你做。

在那個筆記上,一個更直接的方法是在循環中爲datetime添加timedelta。例如,

>>> from datetime import timedelta 
>>> times = 4 
>>> cur_date = datetime.date(2017, 2, 24) 

>>> for _ in range(times): 
     print('today is {0}, do something'.format(cur_date)) 
     cur_date += timedelta(days=7) 

today is 2017-02-24, do something 
today is 2017-03-03, do something 
today is 2017-03-10, do something 
today is 2017-03-17, do something 

根據您的使用情況,這也可以放置在生成器中。

>>> for dt in (cur_date + timedelta(days=x*7) for x in range(times)): 
     print('today is {0}, do something'.format(dt)) 

today is 2017-02-24, do something 
today is 2017-03-03, do something 
today is 2017-03-10, do something 
today is 2017-03-17, do something 

或熊貓pd.date_range

>>> import pandas as pd 
>>> list(pd.date_range(start='2017-02-24', periods=4, freq='7D')) 

[Timestamp('2017-02-24 00:00:00', freq='7D'), 
Timestamp('2017-03-03 00:00:00', freq='7D'), 
Timestamp('2017-03-10 00:00:00', freq='7D'), 
Timestamp('2017-03-17 00:00:00', freq='7D')] 

現在,如果你嘗試用你的方法,這個例子會發生什麼?

>>> year, month, day = 2017, 2, 24 

>>> for i in range(0 , times): 
     day = day 
     fulldateadd = datetime.date(year, month, day) 
     print('today is {0}, do something'.format(fulldateadd)) 
     day = day + 7 
     if day > 31: 
      day = day - 31 
      month = month + 1 

today is 2017-02-24, do something 

ValueErrorTraceback (most recent call last) 
<ipython-input-255-7df608ebbf8e> in <module>() 
     1 for i in range(0 , times): 
     2  day = day 
----> 3  fulldateadd = datetime.date(year, month, day) 
     4  print('today is {0}, do something'.format(fulldateadd)) 
     5  day = day + 7 

ValueError: day is out of range for month 

2月沒有31天...所以你將不得不包括一個檢查與映射到每個月的天數。包括閏年的邏輯。

相關問題