Classificar Dataframe do Pandas por Data

98

Eu tenho um dataframe do pandas da seguinte maneira:

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

Quero classificar por Date, mas a coluna é apenas um object.

Tentei transformar a coluna em um objeto de data, mas me deparei com um problema em que esse formato não é o necessário. O formato necessário é 2015-02-20,etc.

Então, agora estou tentando descobrir como fazer com que o numpy converta as datas 'americanas' no padrão ISO, para que eu possa torná-las objetos de data, para que possa classificá-las.

Como eu converteria essas datas americanas no padrão ISO, ou existe um método mais direto que estou perdendo no pandas?

nicholas.reichel
fonte

Respostas:

149

Você pode usar pd.to_datetime()para converter em um objeto datetime. É necessário um parâmetro de formato, mas no seu caso não acho que você precise.

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

Para pesquisas futuras, você pode alterar a declaração de classificação:

>>> 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
fonte
1
Eu também tenho um df ['Date']. Unique () antes do sort, que retorna uma série em vez de um Dataframe. Isso transforma 20/02/2015 em 19/02/2015 T18: 00: 00.000000000-0600, que é dividido em 19/02/2015. Existe uma maneira de adicionar um dia? Ou uma maneira mais formal de corrigir isso?
nicholas.reichel
1
df.Date.astype(np.int64)deve funcionar para a época
JAB
1
Acontece que essa época estaria errada, pois supõe que sejam 18:00 horas, etc. Eu preciso que sejam 00:00 horas. Eu tenho uma maneira de converter para época se eu pudesse fazer com que os objetos de data não tivessem um horário ou estivessem no horário errado.
nicholas.reichel
para mim pd.to_datetime(df.Date)[0]retornaTimestamp('2015-02-20 00:00:00')
JAB
Iniciando uma nova pergunta com uma descrição mais formal do problema
nicholas.reichel
98

sortmétodo foi descontinuado e substituído por sort_values. Depois de converter para o objeto datetime usandodf['Date']=pd.to_datetime(df['Date'])

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

Observação: para classificar no local e / ou em ordem decrescente (o mais recente primeiro):

df.sort_values(by=['Date'], inplace=True, ascending=False)
Reveille
fonte
3
Eu sugiro que você use com: df.sort_values ​​(by = ['Date'])
FLBKernel
Eu estava quebrando a cabeça, me perguntando por que havia duplicatas na minha classificação. inplace = True corrigiu isso. Muito obrigado!
Dave Davis
11

A resposta do @JAB é rápida e concisa. Mas isso muda o que DataFramevocê está tentando classificar, o que você pode ou não querer.

( Observação : você quase certamente vai querer, porque suas colunas de datas devem ser datas, não strings!)

No caso improvável de você não querer mudar as datas para datas, você também pode fazer isso de uma maneira diferente.

Primeiro, obtenha o índice de sua Datecoluna classificada :

In [25]: pd.to_datetime(df.Date).order().index
Out[25]: Int64Index([0, 2, 1], dtype='int64')

Em seguida, use-o para indexar seu original DataFrame, deixando-o intacto:

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

Magia!

Nota: para Pandas versões 0.20.0 e posteriores, use em locvez de ix, que agora está obsoleto.

LondonRob
fonte
0

Os dados contendo a coluna de data podem ser lidos usando o código a seguir:

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

Uma vez que os dados são lidos usando a linha de código acima, a coluna que contém as informações sobre a data pode ser acessada usando pd.date_time()como:

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

para alterar o formato da data de acordo com o requisito.

Manthra
fonte