Ordenar el marco de datos de Pandas por fecha


93

Tengo un marco de datos de pandas de la siguiente manera:

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

Quiero ordenarlo Date, pero la columna es solo un object.

Intenté convertir la columna en un objeto de fecha, pero encontré un problema en el que ese formato no es el formato necesario. El formato necesario es 2015-02-20,etc.

Así que ahora estoy tratando de averiguar cómo hacer que numpy convierta las fechas 'americanas' en el estándar ISO, para poder hacer que sean objetos de fecha, para poder ordenar por ellos.

¿Cómo convertiría estas fechas americanas en el estándar ISO, o hay un método más sencillo que me falta dentro de los pandas?

Respuestas:


142

Puede usar pd.to_datetime()para convertir a un objeto de fecha y hora. Toma un parámetro de formato, pero en tu caso no creo que lo necesites.

>>> 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 búsquedas futuras, puede cambiar la instrucción de clasificación:

>>> 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
También tengo un df ['Date']. Unique () antes de la clasificación, que devuelve una serie en lugar de un Dataframe. Esto convierte el 20/02/2015 en 2015-02-19T18: 00: 00.000000000-0600 que luego se divide en 2015-02-19. ¿Hay alguna forma de agregar un día? ¿O una forma más formal de corregir esto?
nicholas.reichel

1
df.Date.astype(np.int64)debería funcionar para tiempo de época
JAB

1
Resulta que la época sería incorrecta, ya que asume horas de 18:00 horas, etc. Necesito que sean 00:00 horas. Tengo una forma de convertir a época si pudiera conseguir que los objetos de fecha no tengan una hora o una hora incorrecta.
nicholas.reichel

para mí pd.to_datetime(df.Date)[0]regresaTimestamp('2015-02-20 00:00:00')
JAB

Comenzando una nueva pregunta con una descripción más formal del problema
nicholas.reichel

90

sortEl método ha sido obsoleto y reemplazado por sort_values. Después de convertir al objeto de fecha y hora usandodf['Date']=pd.to_datetime(df['Date'])

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

Nota: para ordenar en el lugar y / o en orden descendente (el más reciente primero):

df.sort_values(by=['Date'], inplace=True, ascending=False)

2
Le sugiero que lo use con: df.sort_values ​​(by = ['Date'])
FLBKernel

11

La respuesta de @ JAB es rápida y concisa. Pero cambia lo DataFrameque está intentando ordenar, lo que puede que desee o no.

( Nota : es casi seguro que lo querrá, porque las columnas de fecha deben ser fechas, no cadenas).

En el improbable caso de que no desee cambiar las fechas por fechas, también puede hacerlo de otra manera.

Primero, obtenga el índice de su Datecolumna ordenada :

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

Luego úselo para indexar su original DataFrame, dejándolo 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 las versiones 0.20.0 de Pandas y posteriores, use en loclugar de ix, que ahora está obsoleto.


0

Los datos que contienen la columna de fecha se pueden leer utilizando el siguiente código:

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

Una vez que se leen los datos usando la línea de código anterior, se puede acceder a la columna que contiene la información sobre la fecha usando pd.date_time()como:

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

para cambiar el formato de la fecha según el requisito.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.