【发布时间】: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'
所以实际上strptime 和strftime 的“循环使用”会导致异常:
>>> 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