【问题标题】:How to convert a str like this format '2017-12-02 23:55:66.333+01:00' to datetime in python?如何在 python 中将这种格式 '2017-12-02 23:55:66.333+01:00' 的 str 转换为 datetime?
【发布时间】:2025-12-17 00:00:01
【问题描述】:

我需要将一组格式为“2017-12-02 23:55:66.333+01:00”的字符串转换为日期时间。

我试过用这个:

from datetime import datetime

date_time_str = '2017-12-02 23:55:66.333+01:00'

date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S%z')

print ("The date is", date_time_obj)

但我有这个输出:

>> ValueError: raise ValueError("time data %r does not match format %r" %
ValueError: time data '2017-12-02 23:55:66.333+01:00' does not match format '%Y-%m-%d %H:%M:%S%z'

如何转换此日期或此 date_time_str 无效?

【问题讨论】:

  • 一分钟怎么有第 66 秒?毫秒在哪里?
  • 我有一个包含以下数据的 csv 文件:“2017-12-02 23:55:66.333+01:00”,所以我需要添加一个 raise:except,秒数大于 60
  • 这能回答你的问题吗? How do I parse an ISO 8601-formatted date?

标签: python string datetime strptime


【解决方案1】:

有两个问题:

  • 你的秒数大于 60
  • 您需要包含微秒格式化程序

因此修复它,

from datetime import datetime
date_time_str = '2017-12-02 23:55:06.333+01:00'
date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f%z')
print("The date is", date_time_obj)

产量

The date is 2017-12-02 23:55:06.333000+01:00

您可以捕获由秒数过大引起的错误,并通过

提出有用的错误消息
from datetime import datetime
date_time_str = '2017-12-02 23:55:06.333+01:00'
try:
    date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f%z')
except ValueError as ve:
    if "unconverted data remains" in ve.args[0]:
        raise ValueError("One of the values in the time string isn't meaninful")
    else:
        raise ve
print("The date is", date_time_obj)

【讨论】:

  • 非常感谢,正如我上面提到的,我有这个字符串 '2017-12-02 23:55:66.333+01:00' csv 文件,然后我需要引发一个异常,因为秒大于 60,对吧?
  • Python 会引发一个错误,但根据您的用户群,您可能需要尝试一下:except 并引发您自己的、更具解释性的错误
  • 是的,我会尝试一下:除了。再次感谢:)
【解决方案2】:

这是你想要做的,缺少剥离微秒和时区部分:

date_time_str = '2017-12-02 23:55:59.333+01:00'
date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f%z')
print ("The date is", date_time_obj)

输出:

The date is 2017-12-02 23:55:59.333000+01:00

或者只是在 python 3.7+ 中使用它:

datetime.fromisoformat(date_time_str)

【讨论】:

  • 在 Python 3.7 以后,还有datetime.fromisoformat(date_time_str)
  • @zmike 是的,有。谢谢你的提及
  • @eshirvana,谢谢!我有这个字符串 '2017-12-02 23:55:66.333+01:00' csv 文件,然后我需要引发异常,因为秒数大于 60,对吧?
  • @AchrefMH 是的,否则它不是一个有效的日期时间值,实际上它大于 59 , 60 也是不可接受的
最近更新 更多