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?

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

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)

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.