Сортировка 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, что в настоящее время не рекомендуется.