Получить максимальную временную метку из списка словаря в pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть таблица фреймов данных, как показано ниже

 status    timeamp;status

recived    [{'status':'pending','date':'21-09-2010'},{'status':'recived','date':'21-10-2011'}]
recived    [{'status':'recived','date':'21-10-2011'}]
pending    [{'status':'pending','date':'19-09-2009'},{'status':'recived','date':'21-10-2001'}]
recived    [{'status':'pending','date':'21-09-2010'},{'status':'recived','date':'21-10-2011'}]
 

Я хочу найти максимальную дату в списке словарей в столбце time amp; status. Как показано ниже в виде списка.
Новый список должен иметь ['21-10-2011','21-10-2011','19-09-2009','21-10-2011']

Я попробовал приведенный ниже код для полного столбца, но это не помогло и бросило string indices must be integers

 new_list=[]
for i in new['timeamp;status']:
    new_list.append(max([x['date'] for x in i]))
 

Любая помощь очень ценится.

Ответ №1:

Сначала необходимо преобразовать значения в словари, а затем использовать ваше решение Series.apply с преобразованием значений в datetimes:

 import ast
df['timeamp;status'] = df['timeamp;status'].apply(ast.literal_eval)

f = lambda x: max(pd.to_datetime([y['date'] for y in x], format='%d-%m-%Y'))
df['new'] = df['timeamp;status'].apply(f)
print (df)
     status                                        timeamp;status        new
0  recived  [{'status': 'pending', 'date': '21-09-2010'}, ... 2011-10-21
1  recived      [{'status': 'recived', 'date': '21-10-2011'}] 2011-10-21
2  pending  [{'status': 'pending', 'date': '19-09-2009'}, ... 2009-09-19
3  recived  [{'status': 'pending', 'date': '21-09-2010'}, ... 2011-10-21
 

Если нужен оригинальный формат:

 f = lambda x: max(pd.to_datetime([y['date'] for y in x], format='%d-%m-%Y'))
df['new'] = df['timeamp;status'].apply(f).dt.strftime('%d-%m-%Y')
print (df)
     status                                        timeamp;status         new
0  recived  [{'status': 'pending', 'date': '21-09-2010'}, ...  21-10-2011
1  recived      [{'status': 'recived', 'date': '21-10-2011'}]  21-10-2011
2  pending  [{'status': 'pending', 'date': '19-09-2009'}, ...  19-09-2009
3  recived  [{'status': 'pending', 'date': '21-09-2010'}, ...  21-10-2011