首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用python解析包含毫秒的时间字符串?

如何使用python解析包含毫秒的时间字符串?
EN

Stack Overflow用户
提问于 2009-03-30 17:36:53
回答 7查看 235K关注 0票数 237

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

代码语言:javascript
复制
>>> 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)

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

代码语言:javascript
复制
>>> 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
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-03-30 17:49:33

Python2.6添加了一个新的strftime/strptime宏%f。这些文档有一点误导,因为它们只提到微秒,但%f实际上可以解析任何小数位的秒数,最多6位,这意味着它也可以在毫秒甚至厘米秒或十分之一秒内工作。

代码语言:javascript
复制
time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')

然而,time.struct_time实际上并不存储毫秒/微秒。您最好使用datetime,如下所示:

代码语言:javascript
复制
>>> 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微秒。

票数 373
EN

Stack Overflow用户

发布于 2010-10-12 23:09:20

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

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

代码语言:javascript
复制
    (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“

票数 12
EN

Stack Overflow用户

发布于 2009-03-30 17:48:23

给出(来自its source的) nstehr's answer引用的代码:

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/698223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档