Анализ типа данных xs: duration в объект datetime.timedelta Python? - PullRequest
2 голосов
/ 04 мая 2010

В соответствии с заголовком я пытаюсь проанализировать XML-файл, содержащий тип данных xs:duration. Я хотел бы преобразовать это в объект Python timedelta, который я затем смогу использовать в дальнейших вычислениях.

Есть ли какой-нибудь встроенный способ сделать это, подобный функции strptime()? Если нет, каков наилучший способ добиться этого?

Ответы [ 2 ]

4 голосов
/ 16 мая 2015

Это старый вопрос, но для дальнейшего использования: вы можете использовать isodate.parse_duration() для этого. Возвращает класс, совместимый с timedelta.

См. https://pypi.python.org/pypi/isodate

4 голосов
/ 04 мая 2010

Поскольку у меня уже есть рабочий пример того, что я задал в вопросе, я опубликую его здесь для полноты. Если придут лучшие ответы, я приму.

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

Это работает, но не будет правильно обрабатывать длину месяца или високосные годы. Для моих целей это не проблема, но стоит иметь в виду.

...