Сортировка Pandas Dataframe by Date
У меня есть pandas dataframe следующим образом:
Symbol Date
A 02/20/2015
A 01/15/2016
A 08/21/2015
Я хочу отсортировать его по Date
, но столбец - это просто object
.
Я попытался сделать столбец объектом даты, но у меня возникла проблема, когда этот формат не соответствует формату. Необходимый формат: 2015-02-20,
и т.д.
Итак, теперь я пытаюсь выяснить, как numpy конвертировать "американские" даты в стандарт ISO, так что я могу сделать их объектами даты, чтобы я мог сортировать их.
Как мне преобразовать эти американские даты в стандарт ISO, или есть более прямой метод, который мне не хватает в pandas?
Ответы
Ответ 1
Вы можете использовать pd.to_datetime()
для преобразования в объект datetime. Он принимает параметр формата, но в вашем случае я не думаю, что вам это нужно.
>>> import pandas as pd
>>> df = pd.DataFrame( {'Symbol':['A','A','A'] ,
'Date':['02/20/2015','01/15/2016','08/21/2015']})
>>> df
Date Symbol
0 02/20/2015 A
1 01/15/2016 A
2 08/21/2015 A
>>> df['Date'] =pd.to_datetime(df.Date)
>>> df.sort('Date') # This now sorts in date order
Date Symbol
0 2015-02-20 A
2 2015-08-21 A
1 2016-01-15 A
Для будущего поиска вы можете изменить оператор сортировки:
>>> df.sort_values(by='Date') # This now sorts in date order
Date Symbol
0 2015-02-20 A
2 2015-08-21 A
1 2016-01-15 A
Ответ 2
Метод sort
устарел для DataFrames. Теперь это sort_values
. После преобразования в объект datetime, используя df['Date']=pd.to_datetime(df['Date'])
,
df.sort_values(by=['Date'])
Примечание: сортировка на месте и/или в порядке убывания (обратный хронологический):
df.sort_values(by=['Date'], inplace=True, ascending=False)
Ответ 3
@JAB ответ быстрый и лаконичный. Но это меняет DataFrame
вы пытаетесь отсортировать, который вы можете или не можете хотеть.
(Примечание: вы почти наверняка захотите, потому что ваши столбцы даты должны быть датами, а не строками!)
В том маловероятном случае, если вы не хотите менять даты на даты, вы также можете сделать это по-другому.
Сначала получите индекс из вашего отсортированного столбца Date
:
In [25]: pd.to_datetime(df.Date).order().index
Out[25]: Int64Index([0, 2, 1], dtype='int64')
Затем используйте его для индексирования вашего исходного DataFrame
, не трогая его:
In [26]: df.ix[pd.to_datetime(df.Date).order().index]
Out[26]:
Date Symbol
0 2015-02-20 A
2 2015-08-21 A
1 2016-01-15 A
Магия!
Примечание: для Pandas версий 0.20.0 и выше используйте loc
вместо ix
, что в настоящее время не рекомендуется.