解析时间字符串的更好方法

时间:2012-02-10 10:47:06

标签: python performance

我一直想知道是否有更简洁,更快捷的方法来解析时间戳,该时间戳可能是来自多个位置/日志文件的3种格式。下面的代码是我目前所拥有的,但它是一个非常难看的工作版本,非常慢。是否有更多的pythonic和更快的方法来实现这一目标?

FORMATS = ["%Y-%m-%d %H:%M:%S"      ,
           "%Y%m%d_%H.%M.%S"        ,
           "%a %b %d %H:%M:%S %Y"]


def _hacktime(self, t):
    # CAUTION: 
    # The nastiest time hack of all TIME
    #
    try:
        t = time.mktime(time.strptime(t, self.FORMATS[0]))
    except:
        try:
            t = time.mktime(time.strptime(t, self.FORMATS[1]))
        except:
            try:
                t = time.mktime(time.strptime(' '.join([t, 
                                                time.strftime('%Y')]),
                                                self.FORMATS[2]))
            except Exception as e:
                print('could not convert time %s: %s' % (t, e))
                t = time.time()   
    return [t, time.ctime(t)]

3 个答案:

答案 0 :(得分:5)

使用循环

the_time= None
for f in FORMATS:
    try:
        the_time = time.mktime(time.strptime(t, f))
        return the_time # or break 
    except ValueError: 
        continue
if the_time is None:
    raise ValueError( "{0!r} is not a valid time".format(t) )

答案 1 :(得分:1)

你可以制作一个正则表达式来匹配前两个,拉出组件字段。

我想这会将它减少到两个分支,因为如果匹配失败,它必须是第三个模式。

如果匹配,您可以直接填充struct_time,因为您拥有所有匹配的字段。

答案 2 :(得分:0)

在尝试使用strptime转换它们之前,您可以检查字符串的“ - ”,“:”和“”计数。不是在为每次尝试缩进更多时尝试和捕获异常,而是在转换工作后使用循环并退出循环(或者只返回)。