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

2025-02-28 08:22:00
admin
原创
110
摘要:问题描述:我能够使用time.strptime解析包含日期/时间的字符串>>> import time >>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S') (2009, 3, 30, 16, 31, 32,...

问题描述:

我能够使用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

解决方案 1:

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微秒。

解决方案 2:

我知道这是一个老问题,但我仍在使用 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”

解决方案 3:

给出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

解决方案 4:

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

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

其中time_str格式如下30/03/09 16:31:32.123

希望这有帮助。

解决方案 5:

我的第一个想法是尝试传递“30/03/09 16:31:32.123”(在秒和毫秒之间用句号代替冒号)。但那行不通。快速浏览文档表明,无论如何都会忽略秒的小数部分...

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

解决方案 6:

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

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

解决方案 7:

对于 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 道


解决方案 8:

它可以检测格式fromisoformat,但挑战在于编写格式。

创建自定义格式化程序是我发现的最方便的方法。

from datetime import datetime
import pytz

d = datetime.fromisoformat("2022-08-05 08:47:50.17+00").astimezone(pytz.utc)
print(f"{d.year:04d}-{d.month:02d}-{d.day:02d}T{d.hour:02d}:{d.minute:02d}:{d.second:02d}.{int(d.microsecond/1000):02d}Z")

因此,格式化的值为:2022-08-05T08:47:50.170Z

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用