237

我能够使用time.strptime解析包含日期/时间的字符串

>>> import time
>>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S')
(2009, 3, 30, 16, 31, 32, 0, 89, -1)

如何解析包含毫秒的时间字符串?

>>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/_strptime.py", line 333, in strptime
    data_string[found.end():])
ValueError: unconverted data remains: .123
4

7 回答 7

373

Python 2.6 添加了一个新的 strftime/strptime 宏%f。文档有点误导,因为它们只提到微秒,但%f实际上解析了最多6 位的秒的任何小数部分,这意味着它也适用于毫秒甚至厘秒或分秒。

time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')

但是,time.struct_time实际上并不存储毫秒/微秒。你最好使用datetime,像这样:

>>> from datetime import datetime
>>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
>>> a.microsecond
123000

如您所见,.123正确解释为123 000微秒。

于 2009-03-30T17:49:33.210 回答
12

我知道这是一个较老的问题,但我仍在使用 Python 2.4.3,我需要找到一种将数据字符串转换为日期时间的更好方法。

如果 datetime 不支持 %f 并且不需要 try/except 的解决方案是:

    (dt, mSecs) = row[5].strip().split(".") 
    dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6])
    mSeconds = datetime.timedelta(microseconds = int(mSecs))
    fullDateTime = dt + mSeconds 

这适用于输入字符串“2010-10-06 09:42:52.266000”

于 2010-10-12T15:09:19.720 回答
4

给出nstehr 的答案所指的代码(来自其来源):

def timeparse(t, format):
    """Parse a time string that might contain fractions of a second.

    Fractional seconds are supported using a fragile, miserable hack.
    Given a time string like '02:03:04.234234' and a format string of
    '%H:%M:%S', time.strptime() will raise a ValueError with this
    message: 'unconverted data remains: .234234'.  If %S is in the
    format string and the ValueError matches as above, a datetime
    object will be created from the part that matches and the
    microseconds in the time string.
    """
    try:
        return datetime.datetime(*time.strptime(t, format)[0:6]).time()
    except ValueError, msg:
        if "%S" in format:
            msg = str(msg)
            mat = re.match(r"unconverted data remains:"
                           " \.([0-9]{1,6})$", msg)
            if mat is not None:
                # fractional seconds are present - this is the style
                # used by datetime's isoformat() method
                frac = "." + mat.group(1)
                t = t[:-len(frac)]
                t = datetime.datetime(*time.strptime(t, format)[0:6])
                microsecond = int(float(frac)*1e6)
                return t.replace(microsecond=microsecond)
            else:
                mat = re.match(r"unconverted data remains:"
                               " \,([0-9]{3,3})$", msg)
                if mat is not None:
                    # fractional seconds are present - this is the style
                    # used by the logging module
                    frac = "." + mat.group(1)
                    t = t[:-len(frac)]
                    t = datetime.datetime(*time.strptime(t, format)[0:6])
                    microsecond = int(float(frac)*1e6)
                    return t.replace(microsecond=microsecond)

        raise
于 2009-03-30T17:48:23.213 回答
3

上面的 DNS 答案实际上是不正确的。SO询问毫秒,但答案是微秒。不幸的是,Python 没有毫秒指令,只有微秒(参见doc),但您可以通过在字符串末尾附加三个零并将字符串解析为微秒来解决它,例如:

datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f')

wheretime_str格式化为30/03/09 16:31:32.123.

希望这可以帮助。

于 2018-11-14T20:28:39.420 回答
1

我的第一个想法是尝试传递它 '30/03/09 16:31:32.123' (在秒和毫秒之间使用句点而不是冒号。)但这不起作用。快速浏览一下文档表明在任何情况下都会忽略小数秒...

啊,版本差异。这被报告为一个错误,现在在 2.6+ 中,您可以使用 "%S.%f" 来解析它。

于 2009-03-30T17:43:21.760 回答
1

来自 python 邮件列表:解析毫秒线程。那里发布了一个似乎可以完成工作的功能,尽管正如作者的评论中提到的那样,它有点像黑客。它使用正则表达式来处理引发的异常,然后进行一些计算。

您也可以在将其传递给 strptime 之前尝试预先执行正则表达式和计算。

于 2009-03-30T17:43:24.427 回答
1

对于 python 2,我这样做了

print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])

它打印时间 "%H:%M:%S" ,将 time.time() 拆分为两个子字符串(之前和之后。) xxxxxxx.xx 并且因为 .xx 是我的毫秒,所以我将第二个子字符串添加到我的 "% H:%M:%S"

希望这是有道理的:) 示例输出:

13:31:21.72 眨眼 01


13:31:21.81 闪烁结束 01


13:31:26.3 眨眼 01


13:31:26.39 闪烁结束 01


13:31:34.65 出发车道 01


于 2014-11-01T13:36:53.393 回答