Python 如何将标准timedelta字符串转换为timedelta对象

Python 如何将标准timedelta字符串转换为timedelta对象,python,datetime,Python,Datetime,将标准timedelta字符串转换为timedelta对象的最简单方法是什么 我已打印了几个timedelta对象,并获得以下字符串: '1157 days, 9:46:39' '12:00:01.824952' '-1 day, 23:59:31.859767' 我知道我可以自己编写解析器,但有没有更简单的解决方案?除了自己编写解析器,我找不到更好的方法。代码看起来很庞大,但本质上是将字符串解析到字典中,这不仅对创建timedelta对象有用 import re def parse(s):

将标准timedelta字符串转换为timedelta对象的最简单方法是什么

我已打印了几个timedelta对象,并获得以下字符串:

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

我知道我可以自己编写解析器,但有没有更简单的解决方案?

除了自己编写解析器,我找不到更好的方法。代码看起来很庞大,但本质上是将字符串解析到字典中,这不仅对创建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()}

希望这能满足您的需要。

这是Ray的答案的更新,适用于Python 3。如果为正则表达式提供了用于解析的坏字符串,它将返回空字符串,否则将返回timedelta对象

from datetime import timedelta
import re

def parse_timedelta(stamp):
    if 'day' in stamp:
        m = re.match(r'(?P<d>[-\d]+) day[s]*, (?P<h>\d+):'
                     r'(?P<m>\d+):(?P<s>\d[\.\d+]*)', stamp)
    else:
        m = re.match(r'(?P<h>\d+):(?P<m>\d+):'
                     r'(?P<s>\d[\.\d+]*)', stamp)
    if not m:
        return ''

    time_dict = {key: float(val) for key, val in m.groupdict().items()}
    if 'd' in time_dict:
        return timedelta(days=time_dict['d'], hours=time_dict['h'],
                         minutes=time_dict['m'], seconds=time_dict['s'])
    else:
        return timedelta(hours=time_dict['h'],
                         minutes=time_dict['m'], seconds=time_dict['s'])
从日期时间导入时间增量
进口稀土
def parse_timedelta(戳记):
如果邮票上有“天”:
m=重新匹配(r'(?P[-\d]+)天*,(?P\d+):'
r'(?P\d+):(?P\d[\.\d+]*),印章)
其他:
m=重新匹配(r'(?P\d+):(?P\d+):'
r'(?P\d[\.\d+]*),印章)
如果不是m:
返回“”
time_dict={key:float(val)表示键,val表示m.groupdict().items()}
如果“d”及时通知:
返回时间增量(天=时间,小时=时间,
分钟=时间,秒=时间
其他:
返回时间增量(小时=时间['h'],
分钟=时间,秒=时间

Bigger picture:为什么要尝试往返对象>字符串>对象?@jonrsharpe我需要使用API,它将timedelta对象返回为字符串。与@jonrsharpe相同-您遇到了什么情况。往返时间增量最直接的方法是
seconds=timedelta\u obj.total\u seconds()
然后
timedelta\u obj=timedelta(seconds=seconds)
…哇。。。对于API来说,这是一个荒谬的反应。无论如何,没有内置的Python方法。所以,你是在写你自己的,或者在看pypi/github/等等之后。。。要查看是否有人已经这样做了……注意:您可以将iteritems()更改为items(),这将在Python 3中起作用
from datetime import timedelta
import re

def parse_timedelta(stamp):
    if 'day' in stamp:
        m = re.match(r'(?P<d>[-\d]+) day[s]*, (?P<h>\d+):'
                     r'(?P<m>\d+):(?P<s>\d[\.\d+]*)', stamp)
    else:
        m = re.match(r'(?P<h>\d+):(?P<m>\d+):'
                     r'(?P<s>\d[\.\d+]*)', stamp)
    if not m:
        return ''

    time_dict = {key: float(val) for key, val in m.groupdict().items()}
    if 'd' in time_dict:
        return timedelta(days=time_dict['d'], hours=time_dict['h'],
                         minutes=time_dict['m'], seconds=time_dict['s'])
    else:
        return timedelta(hours=time_dict['h'],
                         minutes=time_dict['m'], seconds=time_dict['s'])