Saltar al contenido

¿Cómo convierto datetime.timedelta en minutos, horas en Python?

Necesitamos tu ayuda para difundir nuestros ensayos sobre las ciencias informáticas.

Solución:

No hay un formateador integrado para timedelta objetos, pero es bastante fácil hacerlo usted mismo:

days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

O, de manera equivalente, si está en Python 2.7+ o 3.2+:

seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

Ahora puedes imprimirlo como quieras:

' minutes,  hours'.format(minutes, hours)

Por ejemplo:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = days * 24 + seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return hours, minutes, seconds
td = datetime.timedelta(2, 7743, 12345)
hours, minutes, seconds = convert_timedelta(td)
print ' minutes,  hours'.format(minutes, hours)

Esto imprimirá:

9 minutes, 50 hours

Si desea obtener “10 minutos, 1 hora” en lugar de “10 minutos, 1 hora”, también debe hacerlo manualmente:

print ' minute,  hour'.format(minutes, 's' if minutes != 1 else '',
                                      hours, 's' if minutes != 1 else '')

O tal vez quieras escribir un english_plural función para hacer la 's' bits para ti, en lugar de repetirte.

Por tus comentarios, parece que realmente quieres mantener los días separados. Eso es aún más fácil:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return days, hours, minutes, seconds

Si desea convertir esto en un valor único para almacenar en una base de datos, luego vuelva a convertir ese valor único para formatearlo, haga esto:

def dhms_to_seconds(days, hours, minutes, seconds):
    return (((days * 24) + hours) * 60 + minutes) * 60 + seconds

def seconds_to_dhms(seconds):
    days = seconds // (3600 * 24)
    hours = (seconds // 3600) % 24
    minutes = (seconds // 60) % 60
    seconds = seconds % 60
    return days, hours, minutes, seconds

Entonces, juntándolo:

def store_timedelta_in_database(thingy, duration):
    seconds = dhms_to_seconds(*convert_timedelta(duration))
    db.execute('INSERT INTO foo (thingy, duration) VALUES (?, ?)',
               thingy, seconds)
    db.commit()

def print_timedelta_from_database(thingy):
    cur = db.execute('SELECT duration FROM foo WHERE thingy = ?', thingy)
    seconds = int(cur.fetchone()[0])
    days, hours, minutes, seconds = seconds_to_dhms(seconds)
    print ' took  minutes,  hours,  days'.format(thingy, minutes, hours, days)

UN datetime.timedelta corresponde a la diferencia entre dos fechas, no una fecha en sí. Solo se expresa en términos de días, segundos y microsegundos, ya que las unidades de tiempo más grandes, como los meses y los años, no se descomponen limpiamente (¿30 días es 1 mes o 0,9677 meses?).

Si desea convertir un timedelta en horas y minutos, puede utilizar el total_seconds() método para obtener el número total de segundos y luego hacer algunos cálculos:

x = datetime.timedelta(1, 5, 41038)  # Interval of 1 day and 5.41038 seconds
secs = x.total_seconds()
hours = int(secs / 3600)
minutes = int(secs / 60) % 60

No hay necesidad de funciones auxiliares personalizadas si todo lo que necesitamos es imprimir el string de la forma [D day[s], ][H]H:MM:SS[.UUUUUU]. compatibilidad con objetos timedelta str() operación que hará esto. Funciona incluso en Python 2.6.

>>> from datetime import timedelta
>>> timedelta(seconds=90136)
datetime.timedelta(1, 3736)
>>> str(timedelta(seconds=90136))
'1 day, 1:02:16'

Nos puedes añadir valor a nuestro contenido informacional contribuyendo tu experiencia en las anotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *