【问题标题】:sort date objects in Python在 Python 中对日期对象进行排序
【发布时间】:2010-08-07 09:53:09
【问题描述】:

我从日期字符串开始:

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')

如何根据日期对这些进行排序?

【问题讨论】:

    标签: python date sorting object


    【解决方案1】:

    嗯,它没有排序的原因是你没有将排序列表重新分配回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( ) ) )
    

    【讨论】:

    • 真的有那么复杂吗??看看 KennyTM 的回答。
    • 你有没有阅读答案?第一行解决了 OP 的问题,剩下的就是对其他代码的一些帮助。下次试着注意一下。
    • +1 用于重新分配提醒。我只想使用date,因为我只需要日期信息。但是,它没有strptime()
    • 您可以使用.date() 仅提取日期。
    • 好吧,我确实阅读了您的答案以及问题(注意)。问题在您的第一行中得到解决。但是如果您不需要原始列表, list.sort 会更有效。休息(说一些帮助)实际上使它听起来比实际上更复杂。
    【解决方案2】:

    sorted 返回一个排序列表,但输入本身保持不变。试试

    transactions.sort(key=itemgetter(0))
    

    相反。 (默认情况下,元组是按字典顺序比较的,所以你不需要key)。

    【讨论】:

      【解决方案3】:

      如果你想修改你的原始数据,你应该使用排序方法,通常最好保留原始数据并通过 sorted() 排序并在新变量中赋值。

      transactions.sort()
      

      key 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
      

      【讨论】:

        猜你喜欢
        • 2012-04-12
        • 1970-01-01
        • 2019-09-21
        • 2010-12-18
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        • 2014-05-12
        相关资源
        最近更新 更多