Cómo ordenar un marco de datos de Pandas por fecha

En este tutorial, veremos cómo ordenar un marco de datos de Pandas por columnas de fecha únicas y múltiples, en orden ascendente y descendente en Python con ejemplos.

Introducción

Pandas es una biblioteca de análisis y manipulación de datos extremadamente popular. Es la herramienta de referencia para cargar y analizar conjuntos de datos para muchos.

Ordenar correctamente los datos es un elemento crucial de muchas tareas relacionadas con el análisis de datos. En este tutorial, veremos cómo ordenar un DataFrame de Pandas por fecha.

Comencemos con hacer un DataFrame simple con algunas fechas:

1
2
3
4
5
6
7
import pandas as pd

data = {'Name':["John", "Paul", "Dhilan", "Bob", "Henry"], 
'Date of Birth': ["01/06/86", "05/10/77", "11/12/88", "25/12/82", "01/06/86"]}
df = pd.DataFrame(data) 

print(df)

De forma predeterminada, nuestra salida está ordenada por el índice DataFrames:

1
2
3
4
5
6
    Name Date of Birth
0    John      01/06/86
1    Paul      05/10/77
2  Dhilan      11/12/88
3     Bob      25/12/82
4   Henry      01/06/86

Los ojos de águila pueden notar que John y Paul tienen la misma fecha de nacimiento; esto es a propósito, como veremos en un momento.

Convertir cadenas a fechahora en Pandas DataFrame

Hemos ingresado Fecha de nacimiento en formato de fecha y parece estar formateado como tal. Sin embargo, lo primero que debemos hacer es asegurarnos de que Pandas reconozca y comprenda que esta fecha es, de hecho, una fecha.

La forma en que Pandas almacena y manipula los datos en un DataFrame está determinada por su tipo de datos.

El tipo de datos de cada valor se asigna automáticamente, según su apariencia. A 60 se le asignará un tipo entero, mientras que a John se le asignará un tipo de cadena. Verifiquemos el tipo de datos actual de cada columna:

1
print(df.dtypes)

Esto nos da nuestra lista de tipos de datos:

1
2
3
Name             object
Date of Birth    object
dtype: object

Podemos ver que a nuestra columna Fecha de nacimiento se le ha asignado un tipo de objeto de cadena básico de forma predeterminada. Sin embargo, para ordenar, analizar o manipular correctamente nuestras fechas, necesitamos que Pandas reconozca que esta columna contiene fechas.

Cambiemos explícitamente el tipo de datos en nuestra columna Fecha de nacimiento de un tipo objeto a un tipo fechahora.

La forma más fácil de hacer esto es usar la función to_datetime():

1
2
df["Date of Birth"] = pd.to_datetime(df["Date of Birth"])
print(df.dtypes)

Ahora, si revisamos nuestra salida:

1
2
3
Name                     object
Date of Birth    datetime64[ns]
dtype: object

Entonces, podemos ver que hemos cambiado con éxito nuestro tipo de datos a datetime.

Alternativamente, podemos especificar manualmente el tipo de datos de nuestra columna, siempre que, por supuesto, sepamos qué tipo de datos queremos que sea:

1
df["Date of Birth"] = df["Date of Birth"].astype('datetime64[ns]')

Producción:

1
2
3
Name                     object
Date of Birth    datetime64[ns]
dtype: object

Si bien ambos métodos producen el mismo resultado, se prefiere el método to_datetime() ya que fue diseñado explícitamente para este propósito.

Ordenar un marco de datos por fecha en pandas

Ahora que Pandas reconoce correctamente nuestros tipos de datos, clasifiquemos el DataFrame.

Nota: Todos los métodos que usaremos no se ordenan in situ, por lo que tendrá que reasignar el DataFrame modificado a una nueva (o la misma) variable de referencia para persistir el cambio, o puede usar el argumento inplace para cambiar el comportamiento predeterminado.

Ordenar por columna de fecha única en orden ascendente

El método sort_values(), por defecto, ordenará los datos en orden ascendente. Para las fechas, esto significaría que la primera o la más antigua en orden aparecerá en la parte superior de la lista:

1
2
df.sort_values(by='Date of Birth', inplace=True)
print(df)

Ejecutar este código da como resultado:

1
2
3
4
5
6
    Name    Date of Birth
1   Paul    1977-05-10
3   Bob 1982-12-25
0   John    1986-01-06
4   Henry   1986-01-06
2   Dhilan  1988-11-12

Alternativamente, si no desea utilizar el argumento inplace, simplemente puede reasignar el DataFrame devuelto desde el método sort_values() a df (o cualquier otra variable de referencia:

1
df = df.sort_values(by='Date of Birth')

Como dimos que John y Henry tienen el mismo cumpleaños, el orden se basa en su número de índice correspondiente.

Ordenar por columna de fecha única en orden descendente

Se puede cambiar nuestro orden de clasificación a descendente configurando el argumento ascending en False al llamar a la función sort_values():

1
df.sort_values(by='Date of Birth', ascending = False, inplace=True)

Esta vez ordenamos nuestros datos en orden descendente, lo que significa que el último o el más reciente aparecerá en la parte superior de nuestra lista. Nuevamente, como John y Henry tienen el mismo cumpleaños, su pedido se basa en su número de índice:

1
2
3
4
5
6
    Name    Date of Birth
2   Dhilan  1988-11-12
0   John    1986-01-06
4   Henry   1986-01-06
3   Bob 1982-12-25
1   Paul    1977-05-10

Ordenar por varias columnas de fechas

Entonces, ¿qué sucede si tenemos varias columnas de fecha por las que queremos ordenar?

Agreguemos otra columna relacionada con la fecha a nuestro DataFrame y asegurémonos de que ambos tipos de datos estén asignados correctamente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Values for the new column
employment_start = ["22/05/16", "17/08/10", "22/05/16", "11/06/19", "16/06/05"]
# Adding columns to DataFrame
df['Employment Start'] = employment_start

# Applying to_datetime() function to multiple columns at once
df[['Date of Birth', 'Employment Start']] = df[['Date of Birth', 'Employment Start']].apply(pd.to_datetime)

print(df.dtypes)
print(df)

Ahora, veamos si las cosas se ven bien:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Name                        object
Date of Birth       datetime64[ns]
Employment Start    datetime64[ns]
dtype: object

     Name Date of Birth Employment Start
0    John    1986-01-06       2016-05-22
1    Paul    1977-05-10       2010-08-17
2  Dhilan    1988-11-12       2016-05-22
3     Bob    1982-12-25       2019-11-06
4   Henry    1986-01-06       2005-06-16

Ordenar por múltiples columnas de fecha en orden ascendente

Para ordenar el DataFrame por Fecha de nacimiento e Inicio de empleo en orden ascendente, simplemente necesitamos agregar los nombres de ambas columnas a nuestro método sort_values(). Solo tenga en cuenta que la prioridad de la clasificación está determinada por qué columna se ingresa primero:

1
df.sort_values(by=['Date of Birth', 'Employment Start'], inplace=True)

Como este método por defecto es en orden ascendente, nuestra salida será:

1
2
3
4
5
6
    Name    Date of Birth   Employment Start
1   Paul    1977-05-10      2010-08-17
3   Bob 1982-12-25      2019-11-06
4   Henry   1986-01-06      2005-06-16
0   John    1986-01-06      2016-05-22
2   Dhilan  1988-11-12      2016-05-22

Como Fecha de nacimiento es la primera columna ingresada en nuestro método, Pandas la prioriza. Dado que John y Henry tienen la misma Fecha de nacimiento, en su lugar, están ordenados por la columna Employment Start.

Ordenar por múltiples columnas de fecha en orden descendente

Al igual que con la ordenación de una sola columna, podemos cambiar el orden a orden descendente cambiando el parámetro ascendente a Falso:

1
df.sort_values(by=['Date of Birth', 'Employment Start'], ascending = False, inplace=True)

Ahora, nuestra salida en orden descendente es:

1
2
3
4
5
6
Name    Date of Birth   Employment Start
2   Dhilan  1988-11-12  2016-05-22
0   John    1986-01-06  2016-05-22
4   Henry   1986-01-06  2005-06-16
3   Bob     1982-12-25  2019-11-06
1   Paul    1977-05-10  2010-08-17

Como podemos ver, John y Henry aparecen más arriba en la lista, ya que los cumpleaños se muestran en orden descendente. Esta vez, sin embargo, John tiene prioridad sobre Henry debido a su “fecha de inicio de empleo” más reciente.

Ordenar por varias columnas de fecha y orden variable

Ahora, ¿qué pasa si no solo queremos ordenar usando varias columnas, sino también ordenar estas columnas usando diferentes criterios ascendentes? Con Pandas, esto se puede implementar dentro del mismo método sort_values() que hemos usado hasta ahora. Solo tenemos que pasar la lista correcta y correspondiente de valores en el parámetro ascending.

En este ejemplo, supongamos que queremos ordenar nuestro ‘Inicio de empleo’ en orden ascendente, es decir, primero el más antiguo, pero luego su ‘Fecha de nacimiento’ en orden descendente, es decir, el más joven primero:

1
df.sort_values(by=['Employment Start', 'Date of Birth'], ascending = [True, False], inplace=True)

Los datos se ordenan primero por ‘Employment Start’ en orden ascendente, esto tiene prioridad ya que esta fue la primera columna que se pasó en nuestro método. A continuación, ordenamos Fecha de nacimiento en orden descendente. Como Dhilan y John comparten la misma fecha de ‘Inicio de empleo’, Dhilan ahora tiene prioridad porque es más joven que John:

1
2
3
4
5
6
Name    Date of Birth   Employment Start
4   Henry   1986-01-06  2005-06-16
1   Paul    1977-05-10  2010-08-17
2   Dhilan  1988-11-12  2016-05-22
0   John    1986-01-06  2016-05-22
3   Bob 1982-12-25  2019-11-06

Conclusión

Dada la popularidad de la biblioteca Pandas, no sorprende que la clasificación de datos basada en columnas sea un proceso sencillo. Echamos un vistazo a la flexibilidad de usar el método sort_values() en columnas únicas y múltiples, en orden ascendente, descendente e incluso variable. Si bien nos hemos centrado en ordenar por fecha, este método se puede usar en múltiples tipos de datos.

Cuando busque ordenar por fecha en particular, el primer paso, y posiblemente el más importante, es asegurarse de haber asignado correctamente el tipo datetime a nuestros datos. Sin definir correctamente nuestro tipo de datos, corremos el riesgo de que Pandas no reconozca nuestras fechas en absoluto.