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.