gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:16:54 25 4
gpt4 key购买 nike

我有以不同格式表示日期时间的字符串列表。 IE。:

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
我确实明白发生了什么:永远不会到达except-block。相反,“2021010112”的倒数第二个字符被解释为小时数字,最后一个字符被解释为分钟数字。
这是假设的行为吗? datetime doc明确指出 %H 表示一个用零填充的十进制数以及 %M。
我没有得到它还是文档只是误导?为什么 try 块不会引发 ValueError?
有没有一种方便而可靠的方法来解决这个问题?我知道在这种特殊情况下,可以通过交换 try- 和 expect- 块来修复代码。但这不可能是正确的方法。
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com