Сортувати дані кадру Pandas за датою


94

У мене є фрейм даних 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()для перетворення в об'єкт дати та часу. Він приймає параметр формату, але у вашому випадку я не думаю, що він вам потрібен.

>>> 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

1
У мене також є df ['Date']. Unique () перед сортуванням, який повертає серію замість Dataframe. Це робить 20.02.2015 р. 19.02.2015T18: 00: 00.000000000-0600, а потім поділяється на 19.02.2015 р. Чи є спосіб додати день? Або більш офіційний спосіб виправити це?
nicholas.reichel

1
df.Date.astype(np.int64)повинен працювати протягом епохи
ЯБ

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)

2
Я б запропонував вам використовувати його з: df.sort_values ​​(за = ['Дата'])
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')

змінити формат дати відповідно до вимоги.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.