如何解决解析strftime输出时的Python strptime错误
我正在尝试以人类可读的格式存储日期。为此,我保存并读回一个包含日期的字符串。我使用 date.min
来表示任何其他日期之前的日期。
from datetime import datetime,date
d = date.min
s = datetime.strftime(d,"%Y-%m-%d")
print(s)
# 1-01-01
d2 = datetime.strptime(s,"%Y-%m-%d")
# ValueError: time data '1-01-01' does not match format '%Y-%m-%d'
但是,当我尝试使用 strptime
输出的 strftime
解析日期时,我只收到错误消息。似乎 strptime
期待像 0001
这样的前导零,而 strftime 没有输出。
也许可以使用 None
。有没有其他方法可以解决我认为是错误的问题?
解决方法
您需要添加前导零:
尝试更换:
s = {datetime.strftime(d,"%Y-%m-%d")}
与:
s = f'{d.year:04d}-{datetime.strftime(d,"%m-%d")}'
如果你想轻松处理日期,我真的可以推荐'Arrow'库。
https://pypi.org/project/arrow/
Linux 上的 Python 3.9 在对该问题的许多评论中如预期的那样显示了该问题。一种适用于所有平台的解决方法是对日期字符串使用 ISO 格式,并带有 date.isoformat()
:
>>> from datetime import date,datetime
>>> s = date.min.isoformat()
>>> s
'0001-01-01'
>>> d = datetime.strptime(s,"%Y-%m-%d")
>>> d
datetime.datetime(1,1,0)
>>> assert d.date() == date.min
您也可以使用 date.fromisoformat()
代替 strptime()
:
>>> date.fromisoformat(date.min.isoformat())
datetime.date(1,1)
,
strftime
不能向年份添加前导零。它调用底层 C 函数,它在年份前添加前导零的行为是 platform specific。您可以通过自己格式化日期对象来解决此问题。只需检查 d.year
是否小于 1000 并添加需要多少个前导零:
d = date.min
year_str = ''.join(['0' for _ in range(4 - len(str(d.year)))]) + str(d.year)
s = '{year}-{md}'.format(year=year_str,md=datetime.strftime(d,"%m-%d"))
d2 = datetime.strptime(s,"%Y-%m-%d")
# now d2 is equal to datetime.datetime(1,0)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。