2017-01-30 3 views
0

Я хочу отсортировать следующие данные по дате и времени.Сортировка списка значений словаря по дате и времени в python

{'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'} 

Предлагаемое решение here и here не работает для меня.

Hee мой код:

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

здесь выход кода выше:

{'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'} 

Если вы заметили, выше вывод не сортируется по дате и времени.

+0

что является '83' в этих обозначениях' 04-13-12 17: 21: 18: 83'? – RomanPerekhrest

+1

Если ваши значения 'datetime' были выполнены правильно, это другое решение будет работать. –

+1

Я не вижу, как это не сортируется. Он сортируется в алфавитном порядке. Проблема в том, что у вас есть месяцы, поэтому сначала нужно проанализировать дату. –

ответ

2

буквенно-цифровой вид здесь не работает, потому что дата - месяц-день-год. Чтобы он работал правильно, он должен быть год-месяц-день. Я определил вспомогательную функцию для разделения элементов даты и перестраивать tuple так естественно кортеж сортировать соответствует дате сортировать:

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) 

Другая возможность сортировать в соответствии с анализируемой даты, например:

result = sorted(data,key=lambda x : time.strptime(x['datetime'],"%m-%d-%y %H:%M:%S:%f")) 

с данными, которые я получаю:

{'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'} 
+0

Я полагался на dateutil, но мне это не удалось: D – MYGz

+0

эти временные форматы ужасны. –

2

Вы можете написать свою собственную функцию ключа для извлечения и разбора 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) 

результат:

[{'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'}] 
Смежные вопросы