create - python timedelta months
Cómo construir un objeto timedelta a partir de una cadena simple (5)
Ayer tuve un poco de tiempo en mis manos, así que desarrollé la share en un módulo de Python, agregando algunos formatos de expresión de tiempo más, incluyendo todos los solicitados por .
El código fuente está en github (licencia MIT) para cualquiera que lo desee. También está en PyPI:
pip install pytimeparse
Devuelve el tiempo como una cantidad de segundos:
>>> from pytimeparse.timeparse import timeparse
>>> timeparse(''32m'')
1920
>>> timeparse(''2h32m'')
9120
>>> timeparse(''4:13'')
253
>>> timeparse(''5hr34m56s'')
20096
>>> timeparse(''1.2 minutes'')
72
Estoy escribiendo una función que necesita una entrada timedelta para pasarla 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 implementado este tipo de cosas?
Para mí, la solución más elegante, sin tener que recurrir a bibliotecas externas como python-dateutil o analizar manualmente la entrada, es utilizar datetime''s poderoso método de análisis de cadenas strptime
string de strptime
.
from datetime import datetime, timedelta
# we specify the input and the format...
t = datetime.strptime("05:20:25","%H:%M:%S")
# ...and use datetime''s hour, min and sec properties to build a timedelta
delta = timedelta(hours=t.hour, minutes=t.minute, seconds=t.second)
Después de esto puedes usar tu objeto timedelta como normalmente, conviértelo a segundos para asegurarte de que hicimos lo correcto, etc.
print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
Quería ingresar solo un tiempo y luego agregarlo a varias fechas, así que esto funcionó para mí:
from datetime import datetime as dtt
time_only = dtt.strptime(''15:30'', "%H:%M") - dtt.strptime("00:00", "%H:%M")
Si usa Python 3, aquí está la versión actualizada de la solución de Hari Shankar, que utilicé:
from datetime import timedelta
import re
regex = re.compile(r''(?P<hours>/d+?)/''
r''(?P<minutes>/d+?)/''
r''(?P<seconds>/d+?)$'')
def parse_time(time_str):
parts = regex.match(time_str)
if not parts:
return
parts = parts.groupdict()
print(parts)
time_params = {}
for name, param in parts.items():
if param:
time_params[name] = int(param)
return timedelta(**time_params)
para el 4:13, y otros formatos estándar (pero si no sabes cuál) usa dateutil.parser.parse from python-dateutil
Para el primer formato (5hr34m56s), debe analizar usando expresiones regulares
Aquí hay una solución basada en re:
import re
from datetime import timedelta
regex = re.compile(r''((?P<hours>/d+?)hr)?((?P<minutes>/d+?)m)?((?P<seconds>/d+?)s)?'')
def parse_time(time_str):
parts = regex.match(time_str)
if not parts:
return
parts = parts.groupdict()
time_params = {}
for (name, param) in parts.iteritems():
if param:
time_params[name] = int(param)
return timedelta(**time_params)
>>> from parse_time import parse_time
>>> parse_time(''12hr'')
datetime.timedelta(0, 43200)
>>> parse_time(''12hr5m10s'')
datetime.timedelta(0, 43510)
>>> parse_time(''12hr10s'')
datetime.timedelta(0, 43210)
>>> parse_time(''10s'')
datetime.timedelta(0, 10)
>>>