320 votos

¿Python - fácil de añadir a N segundos a un datetime.time?

Dado un datetime.time valor en Python, es hay una manera estándar para agregar un número entero de segundos, por lo que 11:34:59 + 3 = 11:35:02, por ejemplo?

Estas ideas obvias no funcionan:

>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'

Al final he escrito funciones como este:

def add_secs_to_time(timeval, secs_to_add):
    secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
    secs += secs_to_add
    return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)

No puedo dejar de pensar que me estoy perdiendo de una forma más fácil para hacer esto, sin embargo.

Relacionados

451voto

paxdiablo Puntos 341644

Usted puede utilizar lleno datetime variables timedelta, y proporcionando un maniquí de la fecha, a continuación, utilizando time para obtener el valor de tiempo.

Por ejemplo:

import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()

los resultados de los dos valores, los tres segundos de diferencia:

11:34:59
11:35:02

Usted también puede optar por la más legible

b = a + datetime.timedelta(seconds=3)

si usted está tan inclinado.


Si usted está después de una función que puede hacer esto, usted puede considerar el uso de addSecs a continuación:

import datetime

def addSecs(tm, secs):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(seconds=secs)
    return fulldate.time()

a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b

Este salidas:

 09:11:55.775695
 09:16:55

45voto

Eli Courtwright Puntos 53071

Como otros han dicho, puedes usar la plena datetime objetos a través de:

sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

Sin embargo, creo que vale la pena explicar por qué full datetime objetos son necesarios. Considerar qué pasaría si he añadido 2 horas a las 11 de la noche. ¿Cuál es el comportamiento correcto? Una excepción, porque usted no puede tener un tiempo mayor que el de las 11:59pm? Debe envolver alrededor de la espalda?

Los programadores de diferentes te esperan diferentes cosas, así que cualquier resultado que eligieron una sorpresa que un montón de gente. Peor aún, los programadores escribir código que funcionaba bien cuando la probaron inicialmente, y luego tener que romper más tarde por hacer algo inesperado. Esto es muy malo, que es por qué usted no se les permite añadir timedelta objetos a objetos en tiempo.

19voto

unmounted Puntos 10968

Una cosa, puede agregar claridad para anular el valor por defecto para segundos

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)

11voto

Paul Stephenson Puntos 17507

Gracias a @Pax Diablo, @bvmou y @Arachnid por la sugerencia del uso completo fechas a lo largo. Si tengo que aceptar datetime.time objetos desde una fuente externa, entonces esto parece ser una alternativa add_secs_to_time() función:

def add_secs_to_time(timeval, secs_to_add):
    dummy_date = datetime.date(1, 1, 1)
    full_datetime = datetime.datetime.combine(dummy_date, timeval)
    added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
    return added_datetime.time()

Este código detallado puede ser comprimido a esta frase:

(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()

Pero creo que me gustaría envuelven en una función para la claridad de código de todos modos.

8voto

rescdsk Puntos 4136

Si vale la pena agregar otro archivo / dependencia a su proyecto, sólo he escrito una pequeña clase que extiende datetime.time con la capacidad de hacer operaciones aritméticas. Cuando usted va más allá de la medianoche, se envuelve alrededor de cero. Ahora, "¿Qué hora será de 24 horas a partir de ahora" tiene un montón de esquina de los casos, incluyendo el horario de verano, salto segundos, histórica zona horaria de cambios, etc. Pero a veces usted necesita un caso sencillo, y eso es lo que va a hacer.

Su ejemplo debería ser escrita:

>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)

nptime hereda datetime.time, por lo que cualquiera de estos métodos debe ser usable, demasiado.

Está disponible desde PyPi como nptime ("no-pedante tiempo"), o en GitHub: https://github.com/tgs/nptime

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X