2014-01-12 4 views
2

Каков самый простой способ преобразования стандартной строки timedelta в объект timedelta?Как преобразовать стандартную строку timedelta в объект timedelta

Я напечатал несколько объектов timedelta и получил эти строки:

'1157 days, 9:46:39' 
'12:00:01.824952' 
'-1 day, 23:59:31.859767' 

Я знаю, что я мог бы написать парсер себя, но есть ли простое решение?

+0

Большая картинка: почему вы пытаетесь объединить объект> строка> объект? – jonrsharpe

+0

@jonrsharpe Мне нужно использовать API, который возвращает объект timedelta как строку. – niekas

+1

То же, что и @jonrsharpe - что у вас есть такая ситуация. Самый прямой путь к round-trip timedelta - 'seconds = timedelta_obj.total_seconds()' then 'timedelta_obj = timedelta (seconds = seconds)' ... –

ответ

5

Я не могу найти лучший способ, кроме как написать парсер самостоятельно. Код выглядит громоздким, но он по существу разбирает строку в словаре, что полезно не только для создания объекта timedelta.

import re 

def parse(s): 
    if 'day' in s: 
     m = re.match(r'(?P<days>[-\d]+) day[s]*, (?P<hours>\d+):(?P<minutes>\d+):(?P<seconds>\d[\.\d+]*)', s) 
    else: 
     m = re.match(r'(?P<hours>\d+):(?P<minutes>\d+):(?P<seconds>\d[\.\d+]*)', s) 
    return {key: float(val) for key, val in m.groupdict().iteritems()} 

Тест:

from datetime import timedelta 

s1 = '1157 days, 9:46:39' 
s2 = '12:00:01.824952' 
s3 = '-1 day, 23:59:31.859767' 
t1 = parse(s1) 
t2 = parse(s2) 
t3 = parse(s3) 

timedelta(**t1) # datetime.timedelta(1157, 35199) 
timedelta(**t2) # datetime.timedelta(0, 43201, 824952) 
timedelta(**t3) # datetime.timedelta(-1, 86371, 859767) 

Надеется, что это может удовлетворить ваши цели.

Смежные вопросы