如何对日期时间或日期对象列表进行排序?

问题描述 投票:0回答:2

如何对日期和/或日期时间对象列表进行排序?接受的答案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???
python list date sorting datetime
2个回答
183
投票

您会得到

None
,因为
list.sort()
它运行于 in-place,这意味着它不返回任何内容,而是修改列表本身。您只需调用
a.sort()
即可,无需再次分配给
a

有一个内置函数

sorted()
,它返回列表的排序版本 -
a = sorted(a)
也将执行您想要的操作。


3
投票

如果您的列表包含看起来像日期时间的字符串列表,您可以使用日期时间解析器作为键对它们进行排序。

例如,要对

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)]
© www.soinside.com 2019 - 2024. All rights reserved.