26

How to sort the below array of dates on 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']
Rajeev
  • 42,191
  • 76
  • 179
  • 280

9 Answers9

66
>>> 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']
Tim Pietzcker
  • 313,408
  • 56
  • 485
  • 544
  • 2
    This is the most pythonic way I think. It scales to different formats of time, unlike the accepted answer. – CornSmith Sep 18 '13 at 18:21
  • 3
    best answer (+1) but you probably should not call the last object `sorted` as it is also the name of a [function](https://docs.python.org/2/library/functions.html#sorted) – Antoine Jan 10 '17 at 10:01
  • How to disaccept another answer and accept this one? :) – Frankie Drake Dec 28 '21 at 12:05
36
sorted(timestamps, key=lambda d: map(int, d.split('-')))
jd.
  • 10,338
  • 3
  • 44
  • 55
10

Just doing that:

timestamps.sort()

result:

['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']

The order year-month-day allow such a sorting because a day changes before a month and a month changes before a year when time is passing.

It's like for a number: the unity digit (the rightmost digit) changes before the ten digit, and this latter changes before the hundred digit, when 1 is progressively added.

And there is the fact that sort() processes from left to right : if the characters at one precise position are the same in two strings to sort, it will examine the two characters in the two string at the following position to decide which one is logically preceding.

Plus the fact that '0' < '1' is True, '1' < '2' is True etc

eyquem
  • 25,715
  • 6
  • 36
  • 44
6
>>> 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']
Senthil Kumaran
  • 51,269
  • 14
  • 86
  • 124
2

If you sort them into the same format you can just call timestamps.sort()

Jakob Bowyer
  • 32,237
  • 8
  • 73
  • 89
1
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']
pyanon
  • 995
  • 5
  • 3
1
print(sorted(list_of_strings,key=lambda x :(int(x.split('-')[0]),int(x.split('-')[1]),int(x.split('-')[2])))
S.S. Anne
  • 14,415
  • 7
  • 35
  • 68
0

This sort ascending dates in dd/mm/yyyy format

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']
0

In Python 3 and using (my personal favorite) comprehensions. For dates, I would always use Python's 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)
peterb
  • 801
  • 8
  • 7