2015-06-08 48 views
-3

平均鑑於以下列表:獲取的時間

times = [datetime.timedelta(0, 1, 256273), datetime.timedelta(0, 0, 910417), datetime.timedelta(0, 0, 388175)] 

我將如何得到的時間平均?執行以下操作,給我一個錯誤:

avg = (float(sum(times))/len(times)) 
TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta' 
+1

什麼是錯誤? –

+1

重複部分A:http://stackoverflow.com/q/4049825/3001761 – jonrsharpe

回答

5

有兩個問題在這裏:

  • sum()開始了總結與整數0。你可以不timedelta()對象添加到一個整數,所以你得到一個錯誤:

    >>> import datetime 
    >>> times = [datetime.timedelta(0, 1, 256273), datetime.timedelta(0, 0, 910417), datetime.timedelta(0, 0, 388175)] 
    >>> sum(times) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta' 
    
  • 即使你可以只使用sum()顧左右而言他,你不能把它傳遞給float()功能轉換timedelta()對象到float()

    >>> float(datetime.timedelta()) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: float() argument must be a string or a number 
    

你需要告訴sum()開始與空timedelta(開始於timedelta(0)),並使用timedelta.total_seconds()函數來得到一個浮點數:

>>> sum(times, datetime.timedelta()) 
datetime.timedelta(0, 2, 554865) 
>>> sum(times, datetime.timedelta()).total_seconds() 
2.554865 
>>> sum(times, datetime.timedelta()).total_seconds()/len(times) 
0.8516216666666666 

可以省略.total_seconds()部分而另一timedelta()對象:

>>> sum(times, datetime.timedelta())/len(times) 
datetime.timedelta(0, 0, 851621) 

這將是更準確。您可以隨時撥打.total_seconds()後的分工:

>>> (sum(times, datetime.timedelta())/len(times)).total_seconds() 
0.851621 
0

另一種選擇是使用列表理解來獲得的floats名單,這可以概括:

avg = sum([t.total_seconds() for t in times])/len(times) 

# avg == 0.851621666667 

但正如馬亭說,這從一個空的一個開始,將timedelta個對象加在一起更精確。