2013-07-05 2 views
2

Я пытаюсь прочитать из файла журнала, который имеет отметку времени с миллисекундами, как следует , а затем вставляя в словарь на основе «st_time» в качестве ключа.python: сортировка словаря с использованием datetime как ключа

st_time = datetime.strptime(t_str[0],"%d/%b/%Y %H:%M:%S.%f") 
final_dict[st_time] = line 
for key in sorted(final_dict.iterkeys()): 
    print "%s : %s" %(key,final_dict[key]) 

Но я получаю эту ошибку ниже

for key in sorted(final.iterkeys()): 


TypeError: can't compare datetime.datetime to tuple 

Sample: запись из файла журнала

Jul 1 03:27:12 syslog: [m_java]**[ 1/Jul/2013 03:27:12.818]**[j:[SessionThread <]^Iat com/avc/abc/magr/service/find.something(abc/1235/locator/abc;Ljava/lang/String;)Labc/abc/abcd/abcd;(bytecode:7) 

t_str[0] --> ['29/Jun/2013 01:16:06.149'] 

st_time --> 2013-06-29 01:16:06.149000 

Спасибо за любую помощь!

+0

Какие еще ключи у вас есть в этом словаре? –

+0

none - Я просто извлек дату из журнала для сортировки. –

+0

Распечатайте словарь и покажите нам результат. – user2357112

ответ

1
st_time = datetime.strptime(t_str[0],"%d/%b/%Y %H:%M:%S.%f") 
key = float(time.mktime(st_time.timetuple()) + st_time.microsecond/1000000.0) 
final_dict[key] = line 
for key in sorted(final_dict.iterkeys()): 
    print "%s : %s" %(key,final_dict[key]) 

Причина вашей ошибки: strptime возвращает struct_time. Преобразование его в временную метку UNIX (которая будет плавать) должна позволять вам сортировать более легко.

+0

Нет. Это снижает точность «миллисекунды». [28/Jun/2013 11: 14: 42.128] & [28/Jun/2013 11: 14: 42.008] - только один из журналов с этими временными метками превращает его в словарь. –

+0

Его нет. Это число с плавающей запятой. Часть после десятичного знака равна миллисекундам. – beiller

+0

Верю, что ты прав. final_dict [float (time.strftime ('% s.% f', st_time))] = строка должна работать – beiller

-1

Если вы используете словарь и надеетесь, что он будет отсортирован любым способом, вы используете неправильный тип данных.

Существует много других подтипов словаря, которые поддерживают сортировку, но я бы рекомендовал вместо этого использовать двухэлементный кортеж.

sorted_times = sorted([(k, v) for k, v in final_dict.items()]) 

Будет автоматически сортироваться по первой записи каждого кортежа, который должен быть датам.

Смежные вопросы