Python 对字符串日期列表进行排序,没有年份,只有2月29日

Python 对字符串日期列表进行排序,没有年份,只有2月29日,python,python-2.7,datetime,Python,Python 2.7,Datetime,我有一个没有年份成分的日期列表,需要对其进行排序。我的代码未能在2月29日对它们进行排序,并引发了ValueError:day超出了月份的范围异常: 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' ]

我有一个没有年份成分的日期列表,需要对其进行排序。我的代码未能在2月29日对它们进行排序,并引发了
ValueError:day超出了月份的范围
异常:

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']

您的日期没有年份,因此使用默认值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']

如果没有年份,则使用默认值(1900)。1900年没有闰日。解析时在值中添加一年。没有这样的2017年2月29日。您的预期输出是什么,您是否需要能够对任何给定日期进行排序而不使用年,并且始终允许闰日?我在日期列表中没有年份。还有别的办法吗。有没有一种方法可以覆盖默认值并将闰年指定为默认年份?@ΦXocę웃Пepeúpaツ: 1900年也没有2月29日(编辑了我的初始评论)。我喜欢这个解决方案。@如果你猜一年后,任何试图使用日期名称的尝试都会有问题,请注意用户1768610。@JonClements:但对于排序来说,这是很好的。