2010-10-29 8 views
15

Python: cómo obtener la suma de timedelta?¿Cómo obtener la suma de timedelta en Python?

Por ejemplo. Acabo de obtener un montón de objetos timedelta, y ahora quiero la suma. ¡Eso es!

+0

???? no entiendo la pregunta ¿Tienes una fórmula? – Phong

+2

¿Qué haces si tienes muchos objetos enteros y quieres la suma? ¿Qué has intentado? ¿Qué pasó cuando lo intentaste? –

+1

Supongo que si tienes tds = [timedelta(), timedelta(), timedelta(), ...], él quiere saber cómo hacer la suma (tds). Esto no es posible tal como es, ya que el tipo suma comienza con 0 y por lo tanto intenta hacer 0 + timedelta(). Por supuesto, puede hacerlo con una duración de bucle básica = timedelta (0); para td en tds: duración + = td – orzel

Respuesta

8

el método de combinación de fecha y hora le permite combinar el tiempo con un delta

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

timedelta se puede combinar el uso habitual '+' operador

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

Puede leer la documentación del módulo de fecha y hora y una muy buena introducción sencilla a

26

Para añadir timedeltas puede utilizar el operador incorporado +:

result = timedelta1 + timedelta2 

Para añadir una gran cantidad de timedeltas puede utilizar suma:

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

o reducir:

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

Hmmm, yo esperaría que la función de suma también funcionara, pero no me parece en 2.7.3. Lo siguiente falla: '' sum ([datetime.timedelta (1), datetime.timedelta (0, 14700)]) ''. – pelson

+4

@pelson: Falta el segundo parámetro. 'sum ([datetime.timedelta (1), datetime.timedelta (0, 14700)], datetime.timedelta())' da 'datetime.timedelta (1, 14700)'. –

+0

Cool. Gracias @Mark_Byers, ¡lo extrañé! – pelson

0

Como esto "simplemente funciona", supongo que esta pregunta carece de detalles ...

Al igual que este:

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

estoy bastante seguro de que por "suma", quiere decir que quiere que el valor de la suma de un tipo primitivo (por ejemplo, número entero) en lugar de un objeto de fecha y hora.

Tenga en cuenta que siempre puede usar la función dir para reflejar en un objeto y devolver una lista de sus métodos y atributos.

>>> 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'] 

Por lo tanto, en este caso, parece que probablemente deseemos segundos.

>>> time_sum.seconds 
18010 

que se ve bien para mí:

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

Esto no funciona para timedeltas con un componente 'days':' datetime.timedelta (days = 3, hours = 5, seconds = 10) .seconds -> 18010'. Debe ser 277210s ((3 * 24 * 60 * 60) + (5 * 60 * 60) + 10). – RobM

+0

solución mejor: 'time_sum.total_seconds()' (incluye segundos desde el componente de días así) http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds – balleyne

0

(Editar: Suponiendo que por "suma timedelta" quiere decir "convertir un timedelta a int segundos".)

Este es muy ineficiente, pero es simple:

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

Esto convierte una marca de tiempo Unix (0) en un objeto datetime, agrega su delta a él y luego lo convierte a una vez de Unix. Como el tiempo de Unix cuenta segundos, este es el número de segundos que representa tu timedelta.

+0

eso es completamente irrelevante para la pregunta. – SilentGhost

+0

No necesariamente. Comparto la interpretación de Goladus: ese usuario469652 quiere sumar los componentes de un timedelta en un único tipo primitivo, como segundos. Eso es ciertamente lo que estaba buscando cuando encontré esta pregunta. – RobM

+1

Mejor solución: 'myTimeDelta.total_seconds()' http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds – balleyne

Cuestiones relacionadas