2016-11-08 60 views
1

我想编写一个比较函数来排序日期如何用Python语言编写一个比较函数来排序日期

timestamps = ['2011-06-2', '2011-08-05', '2011-02-04', '2010-1-14', '2010-12-13', '2010-1-12', '2010-2-11', '2010-2-07', '2010-12-02', '2011-11-30', '2010-11-26', '2010-11-23', '2010-11-22', '2010-11-16'] 

下列表中如何做到这一点?

UPDATE:

我有这样的:timestamps.sort(key=lambda x: time.mktime(time.strptime(x,"%Y-%m-%d")))

但我想编写一个比较函数。

+1

这些都是字符串,而不是日期。先将它们转换为日期,然后按常规方式进行排序。 – thebjorn

+3

你是否已经做出*任何努力来完成这一切?如果是这样,如果你分享它,有人可能会提供帮助。 –

+0

Python已经弃用'cmp'参数来'sort'来支持'key'。为什么你想写一个比较器功能? – dan04

回答

0

这可能不是这样做的方式,即使它产生正确的结果..

timestamps.sort(key=lambda d:"%d%02d%02d"%tuple(map(int,d.split('-')))) 
0

下面是做到这一点的方法之一:

from datetime import datetime 

timestamps = ['2011-06-2', '2011-08-05', '2011-02-04', '2010-1-14', '2010-12-13', '2010-1-12', '2010-2-11', '2010-2-07', '2010-12-02', '2011-11-30', '2010-11-26', '2010-11-23', '2010-11-22', '2010-11-16'] 

converted_timestamps = [datetime.strptime(x, '%Y-%m-%d') for x in timestamps] 
sorted_timestamps = sorted(converted_timestamps) 
sorted_timestamps_as_string = [datetime.strftime(date, "%Y-%m-%d") for date in sorted_timestamps] 
print(sorted_timestamps_as_string) 

输出:

$蟒tes.py

[ '2010-01-12',“201 0-01-14','2010-02-07', '2010-02-11','2010-11-16','2010-11-22','2010-11-23','2010 -11-26', '2010-12-02','2010-12-13','2011-02-04','2011-06-02','2011-08-05', '2011 -11-30']

我发现它更具可读性。

0

一个简单的方法来处理它。转换为datetime对象,进行排序,然后转换回字符串。

from datetime import datetime 
def sort_dates(string_dates): 
    dates = [datetime.strptime(string_date, "%Y-%m-%d") for string_date in string_dates] 
    dates.sort() 
    return [datetime.strftime(date, "%Y-%m-%d") for date in dates] 

样本输出:

>>> print sort_dates(['2011-06-2', '2011-08-05', '2011-02-04', '2010-1-14', '2010-12-13', '2010-1-12', '2010-2-11', '2010-2-07', '2010-12-02', '2011-11-30', '2010-11-26', '2010-11-23', '2010-11-22', '2010-11-16']) 
['2010-01-12', '2010-01-14', '2010-02-07', '2010-02-11', '2010-11-16', '2010-11-22', '2010-11-23', '2010-11-26', '2010-12-02', '2010-12-13', '2011-02-04', '2011-06-02', '2011-08-05', '2011-11-30']