按日期排序(字符串和日期时间)

时间:2014-04-04 09:57:26

标签: python string sorting datetime

import csv,operator
from datetime import datetime

li = [['name','01/03/2012','job'],
      ['name','02/05/2013','job'],
      ['name','03/08/2014','job']]

排序方法:

sorted(li,key=lambda x:datetime.strptime(row[1],'%d/%m/%Y'), reverse=True)

输出:

没有错误,但根本没有订购

Itemgetter方法:

for x in range(1,len(li)):
    li[x][6]=datetime.strptime(li[x][6],'%d/%m/%Y')

li.sort(key=operator.itemgetter(6))

输出:

Traceback (most recent call last):
  File "U:/rmarshall/Work For Staff/ROB/_Python/__Python Projects Code/April Signed Terms.py", line 35, in <module>
    li.sort(key=operator.itemgetter(6))
TypeError: unorderable types: datetime.datetime() < str()

有人可以提供按日期排序列表的示例。出于教育目的,我将欣赏排序方法和itemgetter方法的示例,并比较效率。

此外,由于itemgetter方法的错误,itemgetter根本无法处理日期时间对象。

注意:我认为在这个例子中升序或降序并不重要,因为它可以简单地用reverse=True翻转。

3 个答案:

答案 0 :(得分:3)

这应该有用。

print(sorted(li, key=lambda x: datetime.strptime(x[1], '%d/%m/%Y'), reverse=True))

您在lamba中使用了row,这可能是之前定义的,但永远不会改变。

我在这里找不到使用itemgetter的方法。说实话,有办法,但看起来并不好。

key_function = lambda x: datetime.strptime(itemgetter(1)(x), '%d/%m/%Y') 
print(sorted(li, key=key_function, reverse=True))

答案 1 :(得分:3)

以下作品:

>>> sorted(li, key=lambda x: datetime.strptime(x[1], "%d/%m/%Y"), reverse=True)
[['name', '03/08/2014', 'job'], ['name', '02/05/2013', 'job'], ['name', '01/03/2
012', 'job']]

使用sorted()时出现的问题是,您尝试从row[1]创建一个不起作用的日期时间。将其更改为您创建的lambda,如上所示。

您很可能在之前的某处定义了row变量,这就是为什么它不会引发错误的原因。但是,如果 I 运行以下内容:

>>> sorted(li,key=lambda x:datetime.strptime(row[1],'%d/%m/%Y'), reverse=True)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 1, in <lambda>
NameError: global name 'row' is not defined

以下是itemgetter的示例:

>>> sorted(l, key=itemgetter(1))
[['name', '01/03/2012', 'job'], ['name', '02/05/2013', 'job'], ['name', '03/08/2014', 'job']]

在您的情况下,它有效,因为您的日期字符串格式正确。将它们转换为datetime对象可能仍然是谨慎的。

答案 2 :(得分:2)

您必须将str转换为datetime,因为sorted无法与datetimestr进行比较。

datetime.strptime用于将str转换为datetime对象。

您可以使用list.sort对相同列表进行排序。

In [43]: li.sort(key=lambda x: datetime.strptime(x[1], "%d/%m/%Y"))

In [44]: li
Out[44]:
[['name', '01/03/2012', 'job'],
 ['name', '02/05/2013', 'job'],
 ['name', '03/08/2014', 'job']]