2012-09-16 8 views
23

Desde:Cómo agregar delta a python datetime.time?

http://docs.python.org/py3k/library/datetime.html#timedelta-objects

A timedelta object represents a duration, the difference between two dates or times.

Entonces por qué me sale error con este:

>>> from datetime import datetime, timedelta, time 
>>> datetime.now() + timedelta(hours=12) 
datetime.datetime(2012, 9, 17, 6, 24, 9, 635862) 
>>> datetime.now().date() + timedelta(hours=12) 
datetime.date(2012, 9, 16) 

>>> datetime.now().time() + timedelta(hours=12) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta' 

Respuesta

35

datetime.time objetos no son compatibles además con datetime.timedelta s.

Sin embargo, hay una definición natural, la aritmética del reloj. Se podría calcular así:

import datetime as dt 
now = dt.datetime.now() 
delta = dt.timedelta(hours = 12) 
t = now.time() 
print(t) 
# 12:39:11.039864 

print((dt.datetime.combine(dt.date(1,1,1),t) + delta).time()) 
# 00:39:11.039864 

dt.datetime.combine(...) levanta la datetime.time t a un objeto datetime.datetime, se añade a continuación el delta, y el resultado se deja caer hacia abajo a un objeto datetime.time.

+9

Es mucho trabajo. Solo quiero calcular un cambio de tiempo, python :). Sin embargo, es la solución, gracias. – xliiv

+0

Una cosa a tener en cuenta aquí es que si 't' es más pequeño que' delta', entonces, terminarás con 'dt.date (1,1,0)', que es un 'OverflowError: date value fuera del rango '. Una forma de abordar esto es aumentar los valores en 'dt.date (...)'. Pero este es todavía un problema con el que hay que tener cuidado. – Akavall

2

¿Cómo funcionaría? datetime.datetime.now().time() devuelve solo horas, minutos, segundos, etc., no hay información de fecha que devuelva .time(), solo el tiempo.

Entonces, ¿qué debería 18:00:00 + 8 hours devolver?
No hay respuesta a esa pregunta, y es por eso que no puede agregar un tiempo y un timedelta.

En otras palabras:

18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it's 2:28:44, Sep. 17, 2012 
18:28:44 + 5 hours # Doesn't make sense. 
+1

Si bien su punto general es correcto, 6pm + 5 horas = 11pm, por lo que es un mal ejemplo, y '.time()' no devuelve una marca de tiempo - una marca de tiempo a menudo incluye suficiente información para derivar una fecha, un objeto 'datetime.time' no. – agf

+0

@agf, sí, estaba editando mi publicación en realidad:). ¡También cambiaré el uso de la marca de tiempo! –

+0

Ok, entiendo la explicación que voy a usar. llámame un estúpido, pero en mi razonamiento agregar horas a la única fecha debería elevar la excepción en cualquiera de los dos :) , sin embargo, no es compacto en esta forma. Creo que es posible que se agregue de vez en cuando en un día (24 horas). ¿Cómo puedo lograr eso en el estado actual, como agregar 2h33m a ahora()? – xliiv

1

Aquí es una función que añade un time a un timedelta:

def time_plus(time, timedelta): 
    start = datetime.datetime(
     2000, 1, 1, 
     hour=time.hour, minute=time.minute, second=time.second) 
    end = start + timedelta 
    return end.time() 

Esto proporcionará el resultado esperado, siempre y cuando no se agrega veces de una manera que cruza un límite de medianoche.

Cuestiones relacionadas