在python中,对日期字段进行排序,字段有时可能为null

时间:2010-02-01 18:09:18

标签: python sorting

我很难想出一个灵巧的方式来处理这种情况。我从数据库读回来的数据。我想对accoutingdate进行评论。但是,accoutingdate有时可能为空。我目前正在做以下事情:

results = sorted(results, key=operator.itemgetter('accountingdate'), reverse=True)

但是,由于一些accoutingdates为null,这次炸弹的“TypeError:无法将datetime.date与NoneType进行比较”。

处理此问题的“最正确”或“最恐怖”的方法是什么?

2 个答案:

答案 0 :(得分:29)

使用key=函数绝对是正确的,您只需要决定如何处理None值 - 选择一个您想要视为等价的datetimeNone用于排序目的。 E.g:

import datetime
mindate = datetime.date(datetime.MINYEAR, 1, 1)

def getaccountingdate(x):
  return x['accountingdate'] or mindate

results = sorted(results, key=getaccountingdate, reverse=True)

看看这比定义cmp函数简单得多 - 如果你做一些基准测试,你会发现它也明显更快!使用cmp函数代替此key函数没有任何优势,这样做是一个糟糕的设计选择。

答案 1 :(得分:11)

您可以使用专门处理None的自定义排序功能:

def nonecmp(a, b):
  if a is None and b is None:
    return 0
  if a is None:
    return -1
  if b is None:
    return 1
  return cmp(a, b)

results = sorted(results, cmp=nonecmp, ...)

这会将None视为小于所有日期时间对象。