【问题标题】:Python datetime: format string %-m (%#m) unexpected behaviourPython 日期时间:格式化字符串 %-m (%#m) 意外行为
【发布时间】:2020-11-06 13:02:42
【问题描述】:

我正在尝试将日期格式为“1/1/18”格式的日期时间对象。我认为proper format string would be '%-m/%-d/%-y'(或Windows 的'%#m/%#d/%#y'),但我无法用official Python docs 确认它。我假设它是 m/d,因为我在电子表格中看到了其他日期(例如 2018 年 5 月 28 日)。

我认为我对没有前导零的日、月和年有疑问。 This site 声明“%-m”(或 Windows 的“%#m”)会给我没有前导零的月份,所以一月会返回 1 而不是 01。让我们试试这个:

>>> date_obj= datetime(year=2018, month=1, day=1)
>>> date_obj
datetime.datetime(2018, 1, 1, 0, 0)
>>> date_obj.strftime("%#m")
'1'

工作正常。

让我们通过一个完整的日期字符串来运行它。

>>> format_string = '%#m/%#d/%#y'
>>> date_obj.strftime(format_string)
'1/1/18'

也很好用。

但是当我尝试使用strptime 函数解析这个字符串时:

>>> datetime.strptime(format_string, '1/1/18')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '%#m/%#d/%#y' does not match format '1/1/18'

所以实际上strptimestrftime 的“循环使用”会导致异常:

>>> datetime.strptime(
        format_string, 
        date_obj.strftime(format_string)
    )

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '%#m/%#d/%#y' does not match format '1/1/18'

将日期字符串“1/1/18”转换为日期时间对象的正确方法是什么?

我用 IPython 控制台重新创建了这个问题。

>>> import sys; print('Python %s on %s' % (sys.version, sys.platform))
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 22:45:29) [MSC v.1916 32 bit (Intel)] on win32

PS 我不对这种日期格式负责,我知道有更好的方法来表示日期。我只是被要求处理这样的数据,并试图使其更具可读性。

【问题讨论】:

    标签: python python-3.x date datetime format


    【解决方案1】:

    您的属性顺序相反。

    应该是 datetime.strptime('1/1/18', format_string)

    小例子:

    from datetime import datetime as dt
    dt.strptime('1/3/18','%m/%d/%y')
    

    help() 结果在strptime:

    关于内置函数strptime的帮助:

    strptime(...) 字符串,格式 -> 从字符串解析的新日期时间(如 time.strptime())。

    【讨论】:

    • 是的,我不知道我是怎么把它误认为是 FORMAT_DATE 的 BigQuery 表示法。谢谢!但不幸的是,它并没有解决我的问题。 datetime.strptime(date_obj.strftime(format_string), format_string) 引发 ValueError: '#' is a bad directive in format '%#m/%#d/%#y'。当它代替“#”时,“-”也是如此。你能帮我解决这个问题吗?
    • 我真的不知道你从哪里得到# 符号。请尝试我示例中的格式字符串。
    • 我从programiz.com/python-programming/datetime/strptime 获取。在我提供的示例中,它与 strftime 一起工作得很好,所以我认为它也是将字符串转换为日期的合法方式。这是真的吗?我的意思是,这是一种在 Python 版本中发生变化的行为?编辑:您的解决方案适用于我必须处理的所有日期。再次感谢您!
    • 您的浏览器是否有显示问题?我在该页面上看到的唯一主题标签是 comments in Example 2
    • @wtarnawski official docs 总是一个很好的来源
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2021-03-09
    • 1970-01-01
    • 2022-06-12
    • 2019-12-11
    相关资源
    最近更新 更多