2010-02-28 23 views
2

我想要完成的事情非常簡單:從一個範圍創建一個循環(下面相當自我解釋),將月份插入到datetime對象中。我知道%d需要一個整數,而且我知道'month'類型是int ...所以我被卡住,爲什麼我不能替代我的月份變量。這裏是我的代碼:試圖從列表中插入一個整數到日期時間對象中

all_months=range(1,13) 
for month in all_months: 
    month_start = (datetime.date(2010,'%d',1))%month 
    next_month_begin= datetime.date(2010,'%d',1)%(month+1) 
    month_end=next_month_begin - timedelta(days=1) 
    print month_start           
    print month_end 

我在做什麼錯?

所有幫助表示感謝!謝謝

回答

2

有幾件事情需要在這裏解決。

編輯:首先,小心你的範圍,因爲你使用的是月份+ 1來創建next_month_begin,你不希望它大於12或者你會得到一個錯誤。

接下來,當您嘗試創建日期對象時,如果使用(datetime.date(2010,'%d',1))%month,則會將該月作爲字符串傳遞。你的代碼可能會拋出這個錯誤TypeError: an integer is required

你需要給它代表月份的整數,而不是整數的字符串(有1'1'之間的差異)。這也是一個簡單的解決方法,因爲你已經有一個變量名爲month,它已經是一個整數,只是用它來代替製作一個字符串。所以,你的代碼應該是這樣的:

month_start = datetime.date(2010,month,1)

我認爲你可以弄清楚如何將其應用到你的next_month_begin分配。

的最後一個問題是,你需要使用datetime.timedelta來告訴Python的datetime模塊中去尋找timedelta()功能 - 您的計劃將目前給你一個錯誤,說是沒有定義timedelta。

如果您在應用這些修補程序時遇到任何問題,請告知我。一定要包括你可能得到的錯誤。

+0

哎呀,我的錯誤,這是當月+ 1導致的問題,謝謝 – swanson 2010-02-28 01:02:07

+1

不是問題,刪除以前的評論 – bernie 2010-02-28 01:04:12

+0

太棒了!除了事實(你注意到)日期時間不接受數字13 ...我試圖解決這個問題,一切工作正常與這些修復。我是否需要在12月份包括一個例外情況,指出它只是迭代到31日?或者有更清晰的方法嗎? – DalivDali 2010-02-28 01:13:28

0

month是一個變量,您可以使用它來創建日期時間對象。我認爲要做到以下幾點:

month_start = datetime.date(2010, month, 1) 
next_month_begin = datetime.date(2010, month+1, 1) 

,將工作,因爲datetime.date()需要3個整數參數。 '%d' % month會改爲將整數month格式化爲字符串。例如,'%04d' % 3會將數字3格式化爲4位數字和前導零。但重要的是要知道,即使(幾乎未格式化)字符串"3"與Python中的3號碼不同。

而且你不能寫datetime(...) % 3,因爲%運算符只能用於格式字符串,如前面的"%03d" % 3示例,而不是在datetime對象上。

但其他類型也可能接受%運算符(不包括日期時間對象)。例如,整數接受%運算符以獲得除法餘數:3 % 2 # returns 1。但在那裏,%的含義完全不同,因爲運算符的含義取決於所涉及的類型。例如,請嘗試3 + 2"3" + "2"。在那裏,+的含義不同(整數加法與字符串連接),因爲類型也不同。

+0

謝謝...我肯定會覺得愚蠢! – DalivDali 2010-02-28 00:50:10

2

您還有其他答案,但是有一種方法可以獲得本月的最後一天。無論當前月份的天數是多少,增加31天都會使您進入下一個月,然後回到第一天,減去一天會給出結束日期。

import datetime 
for month in range(1,13): 
    month_start = datetime.date(2010,month,1) 
    into_next_month = month_start + datetime.timedelta(days=31) 
    month_end = into_next_month.replace(day=1) - datetime.timedelta(days=1) 
    print month_start,month_end          
0

查看日曆模塊(http://docs.python.org/library/calendar.html)。

它包括了這樣的事情電池...

你可能只是做:

from calendar import Calendar 
def start_and_end_days(year, month): 
    cal = Calendar() 
    month_days = [day for day in cal.itermonthdays(year, month) if day.month == month] 
    first_day = month_days[0] 
    last_day = month_days[-1] 
    return (first_day, last_day) 
相關問題