【问题标题】:sort dates in python array在python数组中排序日期
【发布时间】:2011-03-02 11:29:41
【问题描述】:

如何在 python 2.4 上对以下日期数组进行排序

 timestamps = ['2011-06-2', '2011-08-05', '2011-02-04', '2010-1-14', '2010-12-13', '2010-1-12', '2010-2-11', '2010-2-07', '2010-12-02', '2011-11-30', '2010-11-26', '2010-11-23', '2010-11-22', '2010-11-16']

【问题讨论】:

  • 你为什么使用 Python 2.4?

标签: python


【解决方案1】:
>>> import datetime
>>> dates = [datetime.datetime.strptime(ts, "%Y-%m-%d") for ts in timestamps]
>>> dates.sort()
>>> sorteddates = [datetime.datetime.strftime(ts, "%Y-%m-%d") for ts in dates]
>>> sorteddates
['2010-01-12', '2010-01-14', '2010-02-07', '2010-02-11', '2010-11-16', '2010-11-
22', '2010-11-23', '2010-11-26', '2010-12-02', '2010-12-13', '2011-02-04', '2011
-06-02', '2011-08-05', '2011-11-30']

【讨论】:

  • 这是我认为最pythonic的方式。与公认的答案不同,它可以扩展到不同的时间格式。
  • 最佳答案 (+1) 但您可能不应该调用最后一个对象 sorted,因为它也是 function 的名称
  • 如何不接受另一个答案并接受这个? :)
【解决方案2】:
sorted(timestamps, key=lambda d: map(int, d.split('-')))

【讨论】:

  • 酷。不过,在 Python 3 中引发 TypeError
  • 我没有安装 Python 3,但那是因为 map 返回了一个可迭代对象吗?在这种情况下,关键函数应该是 lambda d: tuple(map(int, d.split('-')))。
  • 如果需要数组中的最新日期,可以添加reverse=True参数。
【解决方案3】:

只是这样做:

timestamps.sort()

结果:

['2010-1-12',
 '2010-1-14',
 '2010-11-16',
 '2010-11-22',
 '2010-11-23',
 '2010-11-26',
 '2010-12-02',
 '2010-12-13',
 '2010-2-07',
 '2010-2-11',
 '2011-02-04',
 '2011-06-2',
 '2011-08-05',
 '2011-11-30']

年-月-日的顺序允许这样的排序,因为当时间过去的时候,一天在一个月之前改变,一个月在一年之前改变。

这就像一个数字:个位(最右边的数字)在十位之前变化,而后者在百位之前变化,当逐渐添加 1 时。

还有一个事实,sort()是从左到右处理的:如果一个精确位置的字符在两个要排序的字符串中相同,它会检查这两个字符串中的两个字符后面的位置的字符串来决定哪个在逻辑上在前面。

再加上 '0' 是 True'1' 是 True

【讨论】:

  • 这样,2010-10-1 将排在2010-2-1 之前。
  • @Tim Pietzcker 哦,是的。它仅在数字为 zfilled(2) 时才有效,这种情况更常见
  • 而你的结果是错误的,因为 '2010-2-07''2010-12-13' 之后,这是基数排序
【解决方案4】:
>>> import time
>>> timestamps = ['2011-06-2', '2011-08-05', '2011-02-04', '2010-1-14', '2010-12-13', '2010-1-12', '2010-2-11', '2010-2-07', '2010-12-02', '2011-11-30', '2010-11-26', '2010-11-23', '2010-11-22', '2010-11-16']
>>> timestamps.sort(key=lambda x: time.mktime(time.strptime(x,"%Y-%m-%d")))
>>> timestamps
['2010-1-12', '2010-1-14', '2010-2-07', '2010-2-11', '2010-11-16', '2010-11-22', '2010-11-23', '2010-11-26', '2010-12-02', '2010-12-13', '2011-02-04', '2011-06-2', '2011-08-05', '2011-11-30']

【讨论】:

    【解决方案5】:

    如果你将它们排序成相同的格式,你可以打电话给timestamps.sort()

    【讨论】:

      【解决方案6】:
      map(lambda x:x[1], sorted(map(lambda a:[map(int,a.split('-')),a], timestamps)))
      
      ['2010-1-12',
       '2010-1-14',
       '2010-2-07',
       '2010-2-11',
       '2010-11-16',
       '2010-11-22',
       '2010-11-23',
       '2010-11-26',
       '2010-12-02',
       '2010-12-13',
       '2011-02-04',
       '2011-06-2',
       '2011-08-05',
       '2011-11-30']
      

      【讨论】:

        【解决方案7】:
        print(sorted(list_of_strings,key=lambda x :(int(x.split('-')[0]),int(x.split('-')[1]),int(x.split('-')[2])))
        

        【讨论】:

          【解决方案8】:

          这种以 dd/mm/yyyy 格式升序排列日期

          from datetime import datetime 
          c_array=['07/12/2017', '30/01/2018', '31/05/2016', '30/09/2016', '30/01/2017', '31/05/2017']
          
          sorted(c_array, key=lambda x: datetime.strptime(x, "%d/%m/%Y").strftime("%Y-%m-%d"))
          #out: ['31/05/2016', '30/09/2016', '30/01/2017', '31/05/2017', '07/12/2017', '30/01/2018']
          

          【讨论】:

            【解决方案9】:

            在 Python 3 中并使用(我个人最喜欢的)理解。对于日期,我总是使用 Python 的 datetime lib:

            timestamps = ['2011-06-2', '2011-08-05', '2011-02-04', '2010-1-14', '2010-12-13', '2010-1-12', '2010-2-11', '2010-2-07', '2010-12-02', '2011-11-30', '2010-11-26', '2010-11-23', '2010-11-22', '2010-11-
            timestamps = [datetime.date(*[int(y) for y in x.split("-")]) for x in timestamps]
            sorted_timestamps = sorted(timestamps)
            

            【讨论】:

              猜你喜欢
              • 2020-03-31
              • 2020-07-02
              • 1970-01-01
              • 1970-01-01
              • 2021-04-07
              • 2014-03-02
              • 2012-10-17
              • 2017-10-29
              相关资源
              最近更新 更多