2011-03-10 26 views
63

Tengo dos datetime.time valores, exit y enter y yo quiero hacer algo como:restar dos veces en pitón

duration = exit - enter 

Sin embargo, me sale este error:

TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time 

¿cómo lo hago esto correctamente? Una posible solución es convertir las variables time a datetime variables y luego compilar, pero estoy seguro de que ustedes deben tener una mejor y más limpia manera.

+1

Me gustaría mucho votar esta pregunta respondida, pero no lo haré hasta que se acepte una respuesta. – raratiru

Respuesta

3

datetime.time no es compatible con esto, porque casi no tiene sentido restar tiempos de esta manera. Utilice un completo datetime.datetime si desea hacer esto.

+35

Si sabe por su dominio que dos objetos 'datetime.time'' a' y 'b' son del mismo día, y que' b> a', entonces la operación 'b - a' tiene un significado perfecto. – swalog

+2

Incluso si no son el mismo día, todavía tiene mucho sentido. Al menos tanto sentido como 'arctan (0) = (0, pi, 2pi, ...)', pero simplemente no nos importa ninguno de esos valores después del primero. Entonces, '4:00 - 20: 00' es' 8: 00' - también es ('32: 00',' 56: 00', ...), pero ¿a quién le importa? – naught101

+0

[A menos que sea uno de esos casos que no.] (Https://www.youtube.com/watch?v=-5wpm-gesOY) –

60

Prueba esto:

from datetime import datetime, date 

datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter) 

combine construye una fecha y hora, que puede ser sustraído.

+20

Espero que no esté a horcajadas sobre la medianoche ... –

+2

Para @ Ignacio Vázquez-Abrams punto, uno podría usar, digamos, 'datetime (1,1,1,0,0,0)' en lugar de 'date.today()' . – Akavall

+12

No asigne un nombre a 'datetime'' exit', ya que 'exit' es una función incorporada. – orokusaki

4
import datetime 

def diff_times_in_seconds(t1, t2): 
    # caveat emptor - assumes t1 & t2 are python times, on the same day and t2 is after t1 
    h1, m1, s1 = t1.hour, t1.minute, t1.second 
    h2, m2, s2 = t2.hour, t2.minute, t2.second 
    t1_secs = s1 + 60 * (m1 + 60*h1) 
    t2_secs = s2 + 60 * (m2 + 60*h2) 
    return(t2_secs - t1_secs) 

# using it 
diff_times_in_seconds(datetime.datetime.strptime("13:23:34", '%H:%M:%S').time(),datetime.datetime.strptime("14:02:39", '%H:%M:%S').time()) 
3

en lugar de utilizar timedelta intento tiempo:

from datetime import timedelta 

t1 = timedelta(hours=7, minutes=36) 
t2 = timedelta(hours=11, minutes=32) 
t3 = timedelta(hours=13, minutes=7) 
t4 = timedelta(hours=21, minutes=0) 

arrival = t2 - t1 
lunch = (t3 - t2 - timedelta(hours=1)) 
departure = t4 - t3 

print(arrival, lunch, departure) 
2

tuve situación similar a la suya y que terminó con el uso de la biblioteca externa llamada arrow.

Esto es lo que parece:

>>> import arrow 
>>> enter = arrow.get('12:30:45', 'HH:mm:ss') 
>>> exit = arrow.now() 
>>> duration = exit - enter 
>>> duration 
datetime.timedelta(736225, 14377, 757451) 
21

Uso:

from datetime import datetime, date 

duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning) 

Usando date.min es un poco más concisa y funciona incluso a medianoche.

Este podría no ser el caso con date.today() que podría devolver resultados inesperados si la primera llamada ocurre a las 23:59:59 y la siguiente a las 00:00:00.

+1

de acuerdo con usted. – ramwin

2

La biblioteca de python timedelta debe hacer lo que necesita. Se devuelve un timedelta cuando resta dos instancias datetime.

import datetime 
dt_started = datetime.datetime.utcnow() 

# do some stuff 

dt_ended = datetime.datetime.utcnow() 
print((dt_ended - dt_started).total_seconds())