如何对日期和/或日期时间对象列表进行排序?接受的答案here对我不起作用:
from datetime import datetime,date,timedelta
a=[date.today(), date.today() + timedelta(days=1), date.today() - timedelta(days=1)]
print(a) # [datetime.date(2013, 1, 22), datetime.date(2013, 1, 23), datetime.date(2013, 1, 21)]
a = a.sort()
print(a) # prints 'None'....what???
您会得到
None
,因为 list.sort()
它运行于 in-place,这意味着它不返回任何内容,而是修改列表本身。您只需调用 a.sort()
即可,无需再次分配给 a
。
有一个内置函数
sorted()
,它返回列表的排序版本 - a = sorted(a)
也将执行您想要的操作。
如果您的列表包含看起来像日期时间的字符串列表,您可以使用日期时间解析器作为键对它们进行排序。
例如,要对
lst
进行排序,您可以传递一个 lambda,将每个字符串解析为日期时间作为键(有关可能格式的完整列表,请参阅 https://strftime.org/)。
from datetime import datetime, date
lst = ['02/01/2023 12:25 PM', '01/22/2023 11:00 PM', '12/01/2022 02:23 AM']
sorted_lst = sorted(lst, key=lambda x: datetime.strptime(x, '%m/%d/%Y %I:%M %p'))
# ['12/01/2022 02:23 AM', '01/22/2023 11:00 PM', '02/01/2023 12:25 PM']
# in-place sorting is also possible
lst.sort(key=lambda x: datetime.strptime(x, '%m/%d/%Y %I:%M %p'))
当然,您可以先将它们解析为日期时间,然后进行排序,但这会将列表中项目的类型从
str
更改为 datetime
,如下所示:
new_lst = sorted(datetime.strptime(x, '%m/%d/%Y %I:%M %p') for x in lst)
# [datetime.datetime(2022, 12, 1, 2, 23), datetime.datetime(2023, 1, 22, 23, 0), datetime.datetime(2023, 2, 1, 12, 25)]
如果您的列表是日期和日期时间的混合,您可以将它们全部标准化为日期时间对象,然后排序;再次作为键,以便原始列表中的项目类型不会改变。
lst = [datetime(2013, 1, 21, 6, 14, 47), date(2013, 1, 22), date(2013, 1, 21)]
new_lst = sorted(lst, key=lambda x: x if isinstance(x, datetime) else datetime(x.year, x.month, x.day))
# [datetime.date(2013, 1, 21), datetime.datetime(2013, 1, 21, 6, 14, 47), datetime.date(2013, 1, 22)]