python-3.x - 具有零填充格式的 python datetime strptime 的意外行为

标签 python-3.x datetime format strptime zero-padding

我有代表不同格式的日期时间的字符串列表。即:

list_date_str = ['2021010112', '202101011210']

第一个应翻译为 2021-01-01 12:00,第二个应翻译为 2021-01-01 12:10。 我没有多想就写了这个片段:

import datetime as dt

for date_str in list_date_str:
    try:
        date = dt.datetime.strptime(date_str, '%Y%m%d%H%M')
    except ValueError:
        date = dt.datetime.strptime(date_str, '%Y%m%d%H') 
    print(date)

经过艰苦的错误搜索后,我意识到第一个字符串没有按预期进行解析。代码给出:

2021-01-01 01:02:00
2021-01-01 12:10:00

我确实明白发生了什么:永远不会到达异常(exception) block 。相反,“2021010112”的倒数第二个字符被解释为小时数字,最后一个字符被解释为分钟数字。

这是应该的行为吗? datetime doc明确指出 %H 表示补零十进制数以及 %M。

是我没明白还是文档只是误导?为什么 try block 不会引发 ValueError?

有没有一种方便且可靠的方法来解决这个问题?我知道在这种特殊情况下,可以通过交换 try 和 Expect block 来修复代码。但这不是正确的做法。

PS:此问题也适用于 pd.to_datetime。

最佳答案

也许最简单的方法是在需要时对日期时间字符串进行零填充:

list_date_str = ['2021010112', '202101011210']

for date_str in list_date_str:
    try:
        date = dt.datetime.strptime(f'{date_str:0<12}', '%Y%m%d%H%M')
    except ValueError:
        print(f'Failed to convert {date_str!r}')
        continue 
    print(date)

这里是 fstring f'{date_str:0<12}'用于使用字段宽度 12 对字符串末尾进行零填充。这还允许解析可能根本没有时间分量的较短字符串:

>>> list_date_str = ['2021010112', '202101011210', 'baddate', '20210101', '2021']
>>> for date_str in list_date_str:
...     try:
...         date = dt.datetime.strptime(f'{date_str:0<12}', '%Y%m%d%H%M')
...     except ValueError:
...         print(f'Failed to convert {date_str!r}')
...         continue 
...     print(date)
... 
2021-01-01 12:00:00
2021-01-01 12:10:00
Failed to convert 'baddate'
2021-01-01 00:00:00
Failed to convert '2021'

关于python-3.x - 具有零填充格式的 python datetime strptime 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65666305/

相关文章:

python - Python线程

javascript - JS 如何像计时器一样减去时间(包括毫秒)

javascript - 转换字符串 11/28/2014 11 :00 am to date in JavaScript

python - 无法创建 Django 模型的实例

python-3.x - 在 python 中使用 selenium 禁用 webdriver 的控制台输出

python - 包含 python 对象(例如列表)的 Deepcopy pandas DataFrame

datetime - VB6 日期数据类型 : precision and formatting

ruby-on-rails - 存储时间间隔的有效方法

c# - 标准日期格式与自定义日期格式

c# - 我可以在 Visual Studio 中自动缩进对齐代码吗?