在Python中排序日期对象

0 投票
3 回答
4349 浏览
提问于 2025-04-16 02:27

我开始时有一些日期字符串:

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 参数。)

撰写回答