How to construct a timedelta object from a simple string How to construct a timedelta object from a simple string python python

How to construct a timedelta object from a simple string


To me the most elegant solution, without having to resort to external libraries such as dateutil or manually parsing the input, is to use datetime's powerful strptime string parsing method.

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 timedeltadelta = timedelta(hours=t.hour, minutes=t.minute, seconds=t.second)

After this you can use your timedelta object as normally, convert it to seconds to make sure we did the correct thing etc.

print(delta)assert(5*60*60+20*60+25 == delta.total_seconds())


I had a bit of time on my hands yesterday, so I developed @virhilo's answer into a Python module, adding a few more time expression formats, including all those requested by @priestc.

Source code is on github (MIT License) for anybody that wants it. It's also on PyPI:

pip install pytimeparse

Returns the time as a number of seconds:

>>> from pytimeparse.timeparse import timeparse>>> timeparse('32m')1920>>> timeparse('2h32m')9120>>> timeparse('4:13')253>>> timeparse('5hr34m56s')20096>>> timeparse('1.2 minutes')72


For the first format (5hr34m56s), you should parse using regular expressions

Here is re-based solution:

import refrom datetime import timedeltaregex = 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.items():        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)>>>