Python 解析 strftime 输出时出现 strptime 错误
Python strptime errors on parsing strftime output
我正在尝试以人类可读的格式存储日期。为此,我保存并读回了一个包含日期的字符串。我使用 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'
但是,当我尝试使用 strftime
输出的 strptime
解析日期时,我只得到一个错误。似乎 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/
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, 1, 1, 0, 0)
Python Linux 上的 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, 1, 0, 0)
>>> assert d.date() == date.min
您也可以使用 date.fromisoformat()
代替 strptime()
:
>>> date.fromisoformat(date.min.isoformat())
datetime.date(1, 1, 1)
我正在尝试以人类可读的格式存储日期。为此,我保存并读回了一个包含日期的字符串。我使用 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'
但是,当我尝试使用 strftime
输出的 strptime
解析日期时,我只得到一个错误。似乎 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/
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, 1, 1, 0, 0)
Python Linux 上的 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, 1, 0, 0)
>>> assert d.date() == date.min
您也可以使用 date.fromisoformat()
代替 strptime()
:
>>> date.fromisoformat(date.min.isoformat())
datetime.date(1, 1, 1)