Reputation: 1971
I want to sort the following data by date and time.
{'TID': 'B1', 'sno': '2', 'datetime': '04-13-12 17:21:18:83'}
{'TID': 'A1', 'sno': '4', 'datetime': '11-17-12 22:50:59:30'}
{'TID': 'A2', 'sno': '3', 'datetime': '11-17-12 22:51:00:66'}
{'TID': 'B6', 'sno': '2', 'datetime': '10-28-12 07:26:02:19'}
{'TID': 'B0', 'sno': '8', 'datetime': '02-26-16 08:13:01:30'}
{'TID': 'B4', 'sno': '8', 'datetime': '02-26-16 08:13:02:43'}
{'TID': 'C1', 'sno': '9', 'datetime': '03-08-15 17:12:55:81'}
{'TID': 'A2', 'sno': '23', 'datetime': '03-08-15 17:31:31:12'}
Solution proposed here and here don't work for me.
Hee is my code:
mylist=[]
with open(path+outfile) as fid:
for line in fid:
mylist.append(eval(line))
from operator import itemgetter
newlist = sorted(mylist, key=itemgetter('datetime'))
for item in newlist:
print(str(item))
here is the output of the above code:
{'sno': '8', 'TID': 'B0', 'datetime': '02-26-16 08:13:01:30'}
{'sno': '8', 'TID': 'B4', 'datetime': '02-26-16 08:13:02:43'}
{'sno': '9', 'TID': 'C1', 'datetime': '03-08-15 17:12:55:81'}
{'sno': '23', 'TID': 'A2', 'datetime': '03-08-15 17:31:31:12'}
{'sno': '2', 'TID': 'B1', 'datetime': '04-13-12 17:21:18:83'}
{'sno': '2', 'TID': 'B6', 'datetime': '10-28-12 07:26:02:19'}
{'sno': '4', 'TID': 'A1', 'datetime': '11-17-12 22:50:59:30'}
{'sno': '3', 'TID': 'A2', 'datetime': '11-17-12 22:51:00:66'}
If you notice, the above output is not sorted by date and time.
Upvotes: 1
Views: 5335
Reputation: 140287
alphanumerical sort doesn't work here because the date is month-day-year. For it to work properly it should be year-month-day. I defined an helper function to split the date elements and rebuild a tuple
so natural tuple sort matches date sort:
def sortable_date(x):
d,t = x['datetime'].split()
dtoks = d.split('-')
# year month day time
return (dtoks[2],dtoks[0],dtoks[1],t)
result = sorted(data,key=sortable_date)
Another possibility would be to sort according to parsed date, like this:
result = sorted(data,key=lambda x : time.strptime(x['datetime'],"%m-%d-%y %H:%M:%S:%f"))
with your data I get:
{'TID': 'B1', 'datetime': '04-13-12 17:21:18:83', 'sno': '2'}
{'TID': 'B6', 'datetime': '10-28-12 07:26:02:19', 'sno': '2'}
{'TID': 'A1', 'datetime': '11-17-12 22:50:59:30', 'sno': '4'}
{'TID': 'A2', 'datetime': '11-17-12 22:51:00:66', 'sno': '3'}
{'TID': 'C1', 'datetime': '03-08-15 17:12:55:81', 'sno': '9'}
{'TID': 'A2', 'datetime': '03-08-15 17:31:31:12', 'sno': '23'}
{'TID': 'B0', 'datetime': '02-26-16 08:13:01:30', 'sno': '8'}
{'TID': 'B4', 'datetime': '02-26-16 08:13:02:43', 'sno': '8'}
Upvotes: 3
Reputation: 43870
You can write your own key function to extract and parse the datetime:
import datetime
from operator import itemgetter
mylist = [{'TID': 'B1', 'sno': '2', 'datetime': '04-13-12 17:21:18:83'},
{'TID': 'A1', 'sno': '4', 'datetime': '11-17-12 22:50:59:30'},
{'TID': 'A2', 'sno': '3', 'datetime': '11-17-12 22:51:00:66'},
{'TID': 'B6', 'sno': '2', 'datetime': '10-28-12 07:26:02:19'},
{'TID': 'B0', 'sno': '8', 'datetime': '02-26-16 08:13:01:30'},
{'TID': 'B4', 'sno': '8', 'datetime': '02-26-16 08:13:02:43'},
{'TID': 'C1', 'sno': '9', 'datetime': '03-08-15 17:12:55:81'},
{'TID': 'A2', 'sno': '23', 'datetime': '03-08-15 17:31:31:12'}]
def key_function(item_dictionary):
'''Extract datetime string from given dictionary, and return the parsed datetime object'''
datetime_string = item_dictionary['datetime']
return datetime.datetime.strptime(datetime_string, '%m-%d-%y %H:%M:%S:%f')
mylist.sort(key=key_function)
result:
[{'TID': 'B1', 'datetime': '04-13-12 17:21:18:83', 'sno': '2'},
{'TID': 'B6', 'datetime': '10-28-12 07:26:02:19', 'sno': '2'},
{'TID': 'A1', 'datetime': '11-17-12 22:50:59:30', 'sno': '4'},
{'TID': 'A2', 'datetime': '11-17-12 22:51:00:66', 'sno': '3'},
{'TID': 'C1', 'datetime': '03-08-15 17:12:55:81', 'sno': '9'},
{'TID': 'A2', 'datetime': '03-08-15 17:31:31:12', 'sno': '23'},
{'TID': 'B0', 'datetime': '02-26-16 08:13:01:30', 'sno': '8'},
{'TID': 'B4', 'datetime': '02-26-16 08:13:02:43', 'sno': '8'}]
Upvotes: 2