Sorting a list of dictionary values by date and time in python
我想按日期和时间对以下数据进行排序。
1 2 3 4 5 6 7 8 | {'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'} |
这里和这里提出的解决方案对我不起作用。
HEE是我的代码:
1 2 3 4 5 6 7 8 9 10 | 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)) |
以下是上述代码的输出:
1 2 3 4 5 6 7 8 | {'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'} |
如果您注意到,上面的输出不会按日期和时间排序。
您可以编写自己的键函数来提取和分析日期时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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) |
结果:
1 2 3 4 5 6 7 8 | [{'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'}] |
字母数字排序在这里不起作用,因为日期是月日-年。为了使它正常工作,应该是年-月-日。我定义了一个助手函数来拆分日期元素并重建一个
1 2 3 4 5 6 7 | 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) |
另一种可能是根据解析的日期进行排序,如下所示:
1 | result = sorted(data,key=lambda x : time.strptime(x['datetime'],"%m-%d-%y %H:%M:%S:%f")) |
我从你的数据中得到:
1 2 3 4 5 6 7 8 | {'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'} |