Сортировка фреймов данных Pandas по дате

93

У меня есть фреймворк pandas следующим образом:

Symbol  Date
A       02/20/2015
A       01/15/2016
A       08/21/2015

Я хочу отсортировать его Date, но столбец - это просто object.

Я попытался сделать столбец объектом даты, но столкнулся с проблемой, когда этот формат не является нужным. Нужен формат 2015-02-20,и т. Д.

Итак, теперь я пытаюсь выяснить, как заставить numpy преобразовать «американские» даты в стандарт ISO, чтобы я мог сделать их объектами дат, чтобы я мог сортировать по ним.

Как мне преобразовать эти американские даты в стандарт ISO, или есть ли более простой метод, который мне не хватает в пандах?

Николай Райхель
источник

Ответы:

142

Вы можете использовать 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
JAB
источник
1
У меня также есть df ['Date']. Unique () перед сортировкой, которая возвращает серию вместо Dataframe. Это превращает 20.02.2015 в 2015-02-19T18: 00: 00.000000000-0600, который затем разделяется на 2015-02-19. Есть ли способ добавить день? Или более формальный способ исправить это?
nicholas.reichel
1
df.Date.astype(np.int64)должен работать на время эпохи
JAB
1
Оказывается, эта эпоха была бы неправильной, так как предполагалось время 18:00 часов и т. Д. Мне нужно, чтобы они были 00:00 часов. У меня есть способ преобразовать в эпоху, если бы я мог просто заставить объекты даты не иметь времени или неправильное время.
nicholas.reichel
для меня pd.to_datetime(df.Date)[0]возвращаетсяTimestamp('2015-02-20 00:00:00')
JAB
Начиная новый вопрос с более формального описания проблемы
nicholas.reichel
90

sortметод был устаревшим и заменен sort_values. После преобразования в объект datetime с помощьюdf['Date']=pd.to_datetime(df['Date'])

df.sort_values(by=['Date'])

Примечание: для сортировки на месте и / или в порядке убывания (самые свежие сначала):

df.sort_values(by=['Date'], inplace=True, ascending=False)
Reveille
источник
2
Я бы посоветовал вам использовать его с: df.sort_values ​​(by = ['Date'])
FLBKernel
11

Ответ @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, что теперь не рекомендуется.

Лондон Роб
источник
0

Данные, содержащие столбец даты, можно прочитать с помощью следующего кода:

data = pd.csv(file_path,parse_dates=[date_column])

После того, как данные будут считаны с использованием указанной выше строки кода, к столбцу, содержащему информацию о дате, можно будет получить доступ, pd.date_time()например:

pd.date_time(data[date_column], format = '%d/%m/%y')

изменить формат даты согласно требованию.

Мантра
источник