2010-10-29 15 views
15

Python: come ottenere la somma di timedelta?Come ottenere la somma di timedelta in Python?

Es. Ho appena ricevuto un sacco di oggetti timedelta, e ora voglio la somma. Questo è tutto!

+0

???? non capisco la domanda. Hai una formula? – Phong

+2

Cosa fai se hai molti oggetti interi e vuoi la somma? Che cosa hai provato? Cosa è successo quando ci hai provato? –

+1

la mia ipotesi è che se hai tds = [timedelta(), timedelta(), timedelta(), ...], vuole sapere come fare sum (tds). Questo non è possibile così com'è, dato che il tipo di somma inizia con 0 e quindi prova a fare 0 + timedelta(). Ovviamente puoi farlo con un ciclo di base duration = timedelta (0); per td in tds: duration + = td – orzel

risposta

8

Il metodo di combinazione datetime consente di combinare il tempo con un delta

datetime.combine(date.today(), time()) + timedelta(hours=2) 

timedelta possono essere combinati utilizzando solito '+' operatore

>>> timedelta(hours=3) 
datetime.timedelta(0, 10800) 
>>> timedelta(hours=2) 
datetime.timedelta(0, 7200) 
>>> 
>>> timedelta(hours=3) + timedelta(hours=2) 
datetime.timedelta(0, 18000) 
>>> 

Si può leggere la documentazione del modulo datetime e un ottimo semplice introduzione al

26

Per aggiungere timedeltas è possibile utilizzare l'operatore integrato +:

result = timedelta1 + timedelta2 

Per aggiungere un sacco di timedeltas è possibile utilizzare somma:

result = sum(timedeltas, datetime.timedelta()) 

o ridurre:

import operator 
result = reduce(operator.add, timedeltas) 
+0

Hmmm, mi aspetto che funzioni anche la funzione sum, ma non sembra per me in 2.7.3. Il seguente errore: '' sum ([datetime.timedelta (1), datetime.timedelta (0, 14700)]) ''. – pelson

+4

@pelson: manca il secondo parametro. 'sum ([datetime.timedelta (1), datetime.timedelta (0, 14700)], datetime.timedelta())' fornisce 'datetime.timedelta (1, 14700)'. –

+0

Fresco. Grazie a @Mark_Byers, mi è mancato! – pelson

0

Poiché questo "funziona", presumo che questa domanda manchi di dettagli ...

Proprio come questo:

>>> import datetime 
>>> datetime.timedelta(seconds=10) + datetime.timedelta(hours=5) 
datetime.timedelta(0, 18010) 
0

Sono abbastanza sicuro che con "somma" intende dire che vuole il valore della somma in un tipo primitivo (ad es intero) piuttosto che un oggetto datetime.

Si noti che è sempre possibile utilizzare la funzione dir per riflettere su un oggetto, restituendo un elenco dei relativi metodi e attributi.

>>> import datetime 
>>> time_sum=datetime.timedelta(seconds=10) + datetime.timedelta(hours=5) 
>>> time_sum 
datetime.timedelta(0, 18010) 
>>> dir(time_sum) 
['__abs__', '__add__', '__class__', '__delattr__', '__div__', '__doc__', '__eq__', '__floordiv__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', '__radd__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmul__', '__rsub__', '__setattr__', '__str__', '__sub__', 'days', 'max', 'microseconds', 'min', 'resolution', 'seconds'] 

Quindi, in questo caso, sembra che probabilmente vogliamo secondi.

>>> time_sum.seconds 
18010 

che sembra giusto per me:

>>> 5*60*60 + 10 
18010 
+0

Questo non funziona per timedeltas con un componente 'days':' datetime.timedelta (days = 3, hours = 5, seconds = 10) .seconds -> 18010'. Dovrebbe essere 277210s ((3 * 24 * 60 * 60) + (5 * 60 * 60) + 10). – RobM

+0

Soluzione migliore: 'time_sum.total_seconds()' (comprende secondi dalla componente di giorni pure) http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds – balleyne

0

(Edit: Supponendo che per "somma timedelta" intendi "convertire un timedelta a int secondi".)

Questo è molto inefficiente, ma è semplice:

int((datetime.datetime.fromtimestamp(0) + myTimeDelta).strftime("%s")) 

Questo converte un timestamp Unix (0) in un oggetto datetime, aggiunge il delta ad esso e quindi converte nuovamente in un tempo Unix. Dato che il tempo di Unix conta secondi, questo è il numero di secondi rappresentati da timedelta.

+0

Ecco completamente irrilevante alla domanda. – SilentGhost

+0

Non necessariamente. Condivido l'interpretazione di Goladus - che user469652 vuole sommare i componenti di un timedelta in un singolo tipo primitivo, come i secondi. Questo è certamente quello che stavo cercando quando ho trovato questa domanda. – RobM

+1

Soluzione migliore: 'myTimeDelta.total_seconds()' http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds – balleyne

Problemi correlati