开发者

Parsing an xs:duration datatype into a Python datetime.timedelta object?

开发者 https://www.devze.com 2022-12-29 06:02 出处:网络
As per the title, I\'m trying to parse an XML file containing an xs:duration data type. I\'d like to convert that into a Python timedelta object, which I can then use in further calculations.

As per the title, I'm trying to parse an XML file containing an xs:duration data type. I'd like to convert that into a Python timedelta object, which I can then use in further calculations.

I开发者_如何学运维s there any built-in way of doing this, similar to the strptime() function? If not, what is the best way to achieve this?


Seeing as I already have a working example of what I asked in the question, I'll post it here for completeness. If any better answers come up I'll accept.

period = '-P14D'
regex  = re.compile('(?P<sign>-?)P(?:(?P<years>\d+)Y)?(?:(?P<months>\d+)M)?(?:(?P<days>\d+)D)?(?:T(?:(?P<hours>\d+)H)?(?:(?P<minutes>\d+)M)?(?:(?P<seconds>\d+)S)?)?')

# Fetch the match groups with default value of 0 (not None)
duration = regex.match(period).groupdict(0)

# Create the timedelta object from extracted groups
delta = timedelta(days=int(duration['days']) + (int(duration['months']) * 30) + (int(duration['years']) * 365),
                  hours=int(duration['hours']),
                  minutes=int(duration['minutes']),
                  seconds=int(duration['seconds']))

if duration['sign'] == "-":
    delta *= -1

This works, but won't handle the month lengths or leap years correctly. For my purposes this isn't an issue, but it is worth keeping in mind.


This is an old question, but for future reference: You can use isodate.parse_duration() for this. It returns a class that is compatible with timedelta.

See https://pypi.python.org/pypi/isodate

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号