如何将xs:duration数据类型解析为Python的datetime.timedelta对象?

2 投票
2 回答
2935 浏览
提问于 2025-04-15 22:20

根据标题,我正在尝试解析一个包含 xs:duration 数据类型的 XML 文件。我想把它转换成 Python 的 timedelta 对象,这样我就可以在后续的计算中使用它。

有没有什么内置的方法可以做到这一点,类似于 strptime() 函数?如果没有,最好的解决办法是什么呢?

2 个回答

5

这是一个老问题,但为了将来参考:你可以使用 isodate.parse_duration() 来解决这个问题。它会返回一个和 timedelta 兼容的类。

你可以查看这个链接了解更多信息:https://pypi.python.org/pypi/isodate

5

因为我已经有了一个能正常工作的例子,所以我在这里分享一下,以便让大家更完整地了解。如果有更好的答案出现,我会考虑接受。

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

这个方法可以用,但它不能正确处理每个月的天数或者闰年。对我来说这不是问题,但值得大家注意一下。

撰写回答