2017-01-30 10 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'} 

ソリューションは、私のために動作しませんherehereを提案しました。

喜が私のコードです:ここ

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

あなたは日時を抽出して解析するために、独自のキー機能を記述することができます。

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'}] 
関連する問題