在Python中排序日期对象
我开始时有一些日期字符串:
from operator import itemgetter
import datetime as DT
# unsorted dates
raw = (map(int, "2010-08-01".split("-")),
map(int, "2010-03-25".split("-")),
map(int, "2010-07-01".split("-")))
transactions = []
for year, month, day in raw:
new = (DT.date(year, month, day), "Some data here")
transactions.append(new)
# transactions is now a list with tuples nested inside, for example
# [(date, "Some data here"), (date, "Some data here")]
sorted(transactions, key=itemgetter(0))
for info in transactions:
print info
我得到的结果是这样的,但这些日期并没有按照时间顺序排列:
(datetime.date(2010, 8, 1), 'Some data here')
(datetime.date(2010, 3, 25), 'Some data here')
(datetime.date(2010, 7, 1), 'Some data here')
我该如何按照日期对它们进行排序呢?
3 个回答
2
如果你想改变原始数据,就应该使用sort方法。不过,通常保留原始数据更好,可以用sorted()方法进行排序,然后把结果赋值给一个新变量。
transactions.sort()
在这里,itemgetter这个关键项是不必要的,因为你只是想进行普通的排序。
这是我为你整个代码写的版本:
import datetime as DT
# unsorted dates
raw = ("2010-08-01","2010-03-25","2010-07-01")
datetuples = [tuple(int(numstr) for numstr in dt.split('-'))
for dt in raw] ## numbers from strings
transactions = [(DT.date(* dateint),
"Some data here") for dateint in datetuples]
transactions.sort()
for info in transactions:
print info
4
其实,列表没有排序的原因是你没有把排序后的列表重新赋值给 transactions
;你应该这样做:
transactions = sorted(transactions, key=itemgetter(0))
我还想提一下,datetime
有一个 strptime
函数,它可以帮你完成你手动做的事情:
transactions = [ ( DT.datetime.strptime( datestring, "%Y-%m-%d" ).date(), "Some data here" ) for datestring in datestrings ]
你可能还会更喜欢使用 collections.OrderedDict
,不过也许不一定...
alt_transactions = collections.OrderedDict( sorted( transactions.items( ) ) )
3
sorted
函数会返回一个排好序的列表,但输入的内容本身不会改变。你可以试试
transactions.sort(key=itemgetter(0))
这个方法。(默认情况下,元组是按字典顺序比较的,所以你不需要使用 key
参数。)