排序字符串日期列表,没有年份,但是2月29日

时间:2017-06-02 10:49:33

标签: python python-2.7 datetime

我有一个没有年份组件的日期列表,我需要对其进行排序。我对它们进行排序的代码在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']

1 个答案:

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