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!
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!
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
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)
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
@pelson: manca il secondo parametro. 'sum ([datetime.timedelta (1), datetime.timedelta (0, 14700)], datetime.timedelta())' fornisce 'datetime.timedelta (1, 14700)'. –
Fresco. Grazie a @Mark_Byers, mi è mancato! – pelson
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)
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
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
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
(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.
Ecco completamente irrilevante alla domanda. – SilentGhost
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
Soluzione migliore: 'myTimeDelta.total_seconds()' http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds – balleyne
???? non capisco la domanda. Hai una formula? – Phong
Cosa fai se hai molti oggetti interi e vuoi la somma? Che cosa hai provato? Cosa è successo quando ci hai provato? –
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