我有一个没有年份组件的日期列表,我需要对其进行排序。我对它们进行排序的代码在2月29日失败,并引发了ValueError: day is out of range for month
异常:
from datetime import datetime
a = [
'7-Mar 11:20:33', '7-Mar 10:30:22','22-Mar 22:33:11', '31-Mar 11:22:33',
'25-Mar 03:04:05', '1-Jan 00:00:00', '29-Feb 02:11:10'
]
a.sort(key=lambda date: datetime.strptime(date, "%d-%b %H:%M:%S"))
有没有办法用默认的闰年对这些日期进行排序?
排序后,列表应为:
['1-Jan 00:00:00', '29-Feb 02:11:10', '7-Mar 10:30:22', '7-Mar 11:20:33',
'22-Mar 22:33:11', '25-Mar 03:04:05', '31-Mar 11:22:33']
答案 0 :(得分:2)
您的日期没有年份,因此使用默认值1900:
>>> datetime.strptime('7-Mar 11:20:33', "%d-%b %H:%M:%S")
datetime.datetime(1900, 3, 7, 11, 20, 33)
1900年不是闰年,因此1900年2月29日不存在,并且例外被提出。
如果您必须支持使用闰日和没有年份解析日期,请将您选择的一年添加为要解析的值的字符串,例如'1904 '
,并解析该额外数字:
>>> datetime.strptime('1904 29-Feb 02:11:10', "%Y %d-%b %H:%M:%S")
datetime.datetime(1904, 2, 29, 2, 11, 10)
解析时只需将年份添加为字符串:
a.sort(key=lambda date: datetime.strptime('1904 ' + date, "%Y %d-%b %H:%M:%S"))
使用您的样本数据进行演示:
>>> sorted(a, key=lambda date: datetime.strptime('1904 ' + date, "%Y %d-%b %H:%M:%S"))
['1-Jan 00:00:00', '29-Feb 02:11:10', '7-Mar 10:30:22', '7-Mar 11:20:33', '22-Mar 22:33:11', '25-Mar 03:04:05', '31-Mar 11:22:33']