How to convert string value like "4w 2d.." to timedelta?

Question:

I have incoming string data in format like "4w 2d 5h" (weeks(w), days(d), hours(h), minutes(m)), some it can have different number of parameters (from 1 to 4, e.g "1w", "2w 5h", "3w 1d 5h 3m", etc).
I need to convert it to timedelta (datetime) format.
The only way I know it is to split it and then use statements depending on the letter. But probably there is more efficient way?

Asked By: Roman

||

Answers:

If you’re sure the strings are well formatted then you could try to use re:

import re
from datetime import timedelta

re_td = re.compile(r"(d+)(w|d|h|m)")
units = {"w": "weeks", "d": "days", "h": "hours", "m": "minutes"}

def to_timedelta(string):
    return timedelta(**{units[u]: int(val) for val, u in re_td.findall(string)})

The pattern (d+)(w|d|h|m) looks for numbers followed by one of the allowed letters, and due to the grouping a match in .findall packs them into a tuple. If there could be whitespace between the number and the letter then use (d+)s*(w|d|h|m) instead.

Answered By: Timus
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.