Estoy escribiendo una función que necesita una entrada timedelta para pasar como una cadena. El usuario debe ingresar algo como "32m" o "2h32m", o incluso "4:13" o "5hr34m56s" ... ¿Hay alguna biblioteca o algo que ya tenga este tipo de cosas implementadas?
96
d
días,h
horas,m
minutos ys
segundos utilizando una línea (después de importardatetime
):datetime.timedelta(days = d, hours = h, minutes=m, seconds=s)
.Respuestas:
Para el primer formato (5hr34m56s), debe analizar utilizando expresiones regulares
Aquí está la solución re-basada:
fuente
dateutil.parser.parse
no analizarátimedelta
objetos. Devuelve undatetime
, y desencadenaría una excepción para cadenas como'28:32:11.10'
.Para mí, la solución más elegante, sin tener que recurrir a bibliotecas externas como dateutil o analizar manualmente la entrada, es utilizar el poderoso
strptime
método de análisis de cadenas de datetime .Después de esto, puede usar su objeto timedelta normalmente, convertirlo en segundos para asegurarse de que hicimos lo correcto, etc.
fuente
datetime.strptime("32:20:25","%H:%M:%S")
no funciona) y debe conocer el formato de entrada exacto.timedelta
parámetro bastante molesto, pero lo mejor que se me ocurre para evitar esto es:,delta = t - datetime.combine(t.date(), time.min)
que es ... horrible.Ayer tenía algo de tiempo libre , así que desarrollé la respuesta de @virhilo en un módulo de Python, agregando algunos formatos de expresión de tiempo más, incluidos todos los solicitados por @priestc .
El código fuente está en github (licencia MIT) para cualquiera que lo desee. También está en PyPI:
Devuelve el tiempo como un número de segundos:
fuente
Quería ingresar solo una hora y luego agregarlo a varias fechas, así que esto funcionó para mí:
fuente
dtt.strptime(myduration, "%H:%M:%S") - dtt(1900, 1, 1)
también funciona ...He modificado la buena respuesta de virhilo con algunas actualizaciones:
3m0.25s
3 minutos, 0,25 segundos).
fuente
Si usa Python 3, aquí está la versión actualizada para la solución de Hari Shankar, que usé:
fuente
Django viene con la función de utilidad
parse_duration()
. De la documentación :fuente
Utilice la biblioteca isodate para analizar la cadena de duración ISO 8601. Por ejemplo:
Consulte también ¿Existe una manera fácil de convertir la duración de ISO 8601 en timedelta?
fuente