如何对字符串中的日期进行排序?(python)

如何对字符串中的日期进行排序?(python),python,Python,我只试过了 from datetime import datetime my_dates = ['5-Nov-18', '25-Mar-17', '1-Nov-18', '7 Mar 17'] my_dates.sort(key=lambda date: datetime.strptime(date, "%d-%b-%y")) print(my_dates) 但是我怎样才能使它适用于像这样的日期格式呢 my_dates=['2018年11月5日'、'2017年3月25日'、'2018年11月1

我只试过了

from datetime import datetime
my_dates = ['5-Nov-18', '25-Mar-17', '1-Nov-18', '7 Mar 17']
my_dates.sort(key=lambda date: datetime.strptime(date, "%d-%b-%y"))
print(my_dates)
但是我怎样才能使它适用于像这样的日期格式呢


my_dates=['2018年11月5日'、'2017年3月25日'、'2018年11月1日'、'2017年3月7日']
想到的一个不雅观的解决方案是用破折号替换所有空格,如下所示:

from datetime import datetime
my_dates = ['5-Nov-18', '25-Mar-17', '1-Nov-18', '7 Mar 17']
my_dates.sort(key=lambda date: datetime.strptime(date.replace(' ', '-'), "%d-%b-%y"))
print(my_dates)

如果您只是查看您提供的一组特定日期,只需在
strtime()
中更改格式:

但是,如果您的
列表中有不同的日期格式
,您可以准备一个可能预期的字符串格式的
列表
,并定义您自己的函数来分析每种格式:

def func(date, formats):
    for frmt in formats:
        try:
            str_date = datetime.strptime(date, frmt)
            return str_date
        except ValueError:
            continue

    # might want to consider handling a scenario when nothing is returned

my_formats = ['%d-%b-%y', '%d %b %y', '%d %b %Y']
my_dates = ['5-Nov-18', '25-Mar-17', '1-Nov-18', '7 Mar 17', '05 Nov 2018', '25 Mar 2017', '01 Nov 2018', '07 Mar 2017']
my_dates.sort(key=lambda date: func(date, my_formats))
print(my_dates)

# ['7 Mar 17', '07 Mar 2017', '25-Mar-17', '25 Mar 2017', '1-Nov-18', '01 Nov 2018', '5-Nov-18', '05 Nov 2018']

这里需要注意的是,如果出现意外的日期格式,函数将返回
None
,因此无法正确排序。如果这是一个问题,您可能希望在所有解析尝试失败时在
func()
的末尾添加一些处理。一些开发人员也可能会说要避免
try…除了…
,但我只能这样想。

一旦日期是
datetime
对象,就可以对日期进行排序

my_dates = ['05 Nov 2018', '25 Mar 2017', '01 Nov 2018', '07 Mar 2017']
my_dates = [ dt.strptime(date, '%d %b %Y') for date in my_dates ]
print(my_dates)
# [datetime.datetime(2018, 11, 5, 0, 0), datetime.datetime(2017, 3, 25, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2017, 3, 7, 0, 0)]

my_dates.sort()
print(my_dates)
# [datetime.datetime(2017, 3, 7, 0, 0), datetime.datetime(2017, 3, 25, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 5, 0, 0)]

my_dates = [ date.strftime('%d %b %Y') for date in my_dates ]
print(my_dates)
# ['07 Mar 2017', '25 Mar 2017', '01 Nov 2018', '05 Nov 2018']

那么,为什么不让空格成为格式的一部分呢?
my_dates = ['05 Nov 2018', '25 Mar 2017', '01 Nov 2018', '07 Mar 2017']
my_dates = [ dt.strptime(date, '%d %b %Y') for date in my_dates ]
print(my_dates)
# [datetime.datetime(2018, 11, 5, 0, 0), datetime.datetime(2017, 3, 25, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2017, 3, 7, 0, 0)]

my_dates.sort()
print(my_dates)
# [datetime.datetime(2017, 3, 7, 0, 0), datetime.datetime(2017, 3, 25, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 5, 0, 0)]

my_dates = [ date.strftime('%d %b %Y') for date in my_dates ]
print(my_dates)
# ['07 Mar 2017', '25 Mar 2017', '01 Nov 2018', '05 Nov 2018']