2011-02-15 34 views
14

我已經創建了一個timedelta對象列表,並且我需要獲得此列表的平均值。當我嘗試做需要來自timedelta對象列表的平均值

return (sum(delta_list)/(len(delta_list)-1)) 

我得到類型錯誤:「詮釋」和「datetime.timedelta」

我新在與蟒蛇日期時間類的工作:爲+不支持的操作類型。我也想知道如何將這個平均值變成像days這樣的格式:hours:mins:我不需要小於mins的任何東西。

+4

`謝謝先進.`。事先不要感謝,以後忘記謝謝。學會接受你的答案。 – user225312 2011-02-15 16:19:59

+0

你發佈的代碼有什麼問題?它有錯誤嗎?請顯示你得到的錯誤? – 2011-02-15 16:22:49

+0

我忘了粘貼它,我編輯了問題以包含錯誤。 – cferbs 2011-02-15 16:26:28

回答

25

sum想要一個起始值,這是默認的0,但0不能被添加到timedelta,所以你得到的錯誤。

你只需要給sum一個timedelta()作爲起始值:

# this is the average 
return sum(delta_list, timedelta())/len(delta_list) 

要打印出來,你可以這樣做:

print str(some_delta) 

如果你想要的東西定製,你可以得到some_delta.dayssome_delta.seconds但你必須計算之間的一切。

2

A datetime.timedelta對象具有訪問天,微秒和秒的屬性。您可以輕鬆地引用這些,例如:

>>> import datetime 
>>> daybefore = datetime.timedelta(days=1) 
>>> dayminus2 = datetime.timedelta(days=2, minutes=60) 
>>> daybefore.days 
1 
>>> dayminus2.days, dayminus2.seconds 
(2, 3600) 

要提高60

3

sum() function讓你不得不分秒分鐘需要一個初始值在迭代的所有項目添加到。它默認爲0,這就是爲什麼你會收到有關將timedelta添加到int的錯誤原因。

爲了解決這個問題,只傳遞一個timedelta對象作爲第二個參數,以sum

(創建不帶參數一個timedelta對應於零時差一個創建)

另外,平均一組項目通常是項目數量除以項目數量的總和,因此您不需要從len(delta_list)中減去1。

這些更改意味着我們可以從您的語句中刪除一些括號。

所以這給你:

return sum(delta_list,timedelta())/len(delta_list) 
3

首先,sum將所有從列表中元素的初始值,默認情況下爲0(爲零的整數)。因此,要在timedelta的列表中使用sum,您需要通過timedelta(0)參數 - sum(delta_list, timedelta(0))

其次,你爲什麼要從列表的長度中減去一個?如果列表長度爲1,您將得到一個ZeroDivisionError

修正了上面的問題後,您最終會得到一個平均值爲timedelta的對象。如何將其轉換爲人類可讀的格式,我將作爲練習離開你。 datetime module documentation應該回答所有可能的問題。