¿Cómo trabajar fechas y horas con Pandas?

Esta biblioteca provee herramientas y métodos muy efectivos.

Asairi Nava
Nowports Tech and Product
5 min readApr 25, 2022

--

Trabajar fechas y horas con librería Pandas

Manejar datos con Pandas es realmente entretenido gracias a las múltiples herramientas que aporta. Tanto sus métodos como argumentos permiten manipularlos, de tal manera, que se puede obtener información muy valiosa y hallazgos sorprendentes.

Si bien es una librería que aporta beneficios, para fines de este artículo te platicaré sus ventajas para trabajar específicamente fechas y horas. Sigue leyendo que a continuación te explico.😉

¿De qué manera trabajar fechas y horas usando Pandas?

En el caso de las fechas y horas (datetime), el análisis, además de necesitar de herramientas específicas, también requiere de mucha atención para saber en qué momento se debe lidiar con un horario estándar o con uno de verano. De lo contrario, se puede entorpecer todo el trabajo realizado.

Esto no es un problema para Pandas, pues permite obtener la media, la mediana, sumar, restar, dividir, y más, siempre y cuando los datos sean numéricos. Por esto debemos transformar las fechas y horas (datetime), de cadenas u objetos, a números.

Las fechas suelen representarse como una combinación de letras, símbolos y números, lo que le impide que Python realizar operaciones matemáticas o leerlas como un número, e inmediatamente las encasilla en cadenas (string).

¿Cómo convertir cadenas en números?

Para convertir los datos de las fechas y horas, de cadenas a un formato numérico, necesitamos utilizar parse_dates al momento de leer el csv, e indicar a qué columnas queremos cambiarle el formato:

rides = pd.read:csv(‘capital-onebike.csv, parse_date=[‘Start date’, ‘End date’]

Al hacerlo, Pandas leerá las columnas y tratará de descubrir su formato, mientras rogamos que no exista algún error o dato que no pueda convertir.🤞

Si algo así llegara a suceder, no hay de qué preocuparnos. Tenemos la ventaja de contar con el método to_datetime() que nos permite formatear los datos manualmente, y así convertir todas las columnas a un formato de fechas y horas:

rides[‘Start date´] = pd.to_datetime(rides[‘Start date’], format = “%Y-%m-%-d %H:%M:%S”)

Después de todo este proceso de formateo, cada que le pidamos a Python una revisión de la columna, nos regresará una marca de tiempo (timestamp) que no es más que un objeto datetime con un nombre diferente.

Ejemplos de fechas y horas con Pandas

Gracias a esto, podremos realizar las operaciones aritméticas que sean necesarias, por ejemplo: generar una nueva columna que refleje la duración de un viaje, misma que representaría la diferencia entre su fecha de inicio (Start date) y la de su final (End date):

rides[‘Duration’] = rides[‘End date’] — rides[‘Start date’]

La columna creada nos permite encontrar datos que indiquen cuánto tiempo tardó el viaje, pero con la ventaja de que podrá visualizarse con un formato de fecha y hora para facilitar las operaciones matemáticas. Esto lo transformamos a segundos con ayuda del método .dt.total_seconds().

Al obtener la diferencia entre la fecha de inicio y la fecha final convertida a segundos, podemos facilitar la suma del total de la columna, la división y hasta la obtención de medidas estadísticas como la media y la mediana.

Y lo mejor, es que esto no es todo lo que podemos realizar.

Para crear un análisis más profundo de los datos que se obtienen de la tabla, también debemos tratar con los datos no numéricos, lo cual es posible realizar contando cuántos valores existen, cuántas veces aparece un dato y la frecuencia de uso por parte de miembros o usuarios ocasionales.

#Contar cuántas veces comenzaron viajes desde cada estación de bicicletas

rides[‘Member type’].value_counts()

Member 236

Casual 54

#Porcentaje de viajes por miembro

rides[‘Member type’].value_counts() / len(rides)

Member 0.813793

Casual 0.186207

También podemos agrupar los datos por columnas con el método .groupby(), para analizar todas las variables donde esa columna interfiera. O por tiempo con el método .resample(), para tomar una unidad de tiempo y una columna de fecha que facilite realizar la agrupación.

#Promedio de duración por tipo de miembro

rides.groupby(‘Member type’)[‘Duration seconds’].mean()

#Promedio de duración por mes

rdes.resample(‘M’, on=’Start date’)[‘Duration seconds’].mean()

Esta es la parte sencilla de tratar datos con Pandas, ya que la complejidad aumenta cuando trabajamos con zonas horarias y los horarios de verano.

Si le pedimos a Pandas que nos arroje la diferencia entre dos viajes, suele generar números positivos, lo que nos permite saber perfectamente cuánto tiempo tardamos en llegar de un punto a otro, sin embargo, puede darse el caso de que la diferencia sea negativa, y es aquí cuando se presenta un problema para nuestro análisis.

Rides[‘Duration’].dt.total_seconds().min()

-033460

En esta situación nos damos cuenta de que intervino el horario de verano, por lo que nuestro cálculo se vio afectado por el cambio, tanto del uso horario como del horario del lugar.

Estos objetos de fecha y hora son considerados como ingenuos de la zona horaria (timezone naive), ya que no están vinculados a ningún tiempo absoluto con un desplazamiento UTC (tiempo universal coordinado).

¿Cómo conocer una zona horaria en Pandas?

El método para poder saber en qué zona horaria se encuentra la fecha y hora en Pandas es .dt.tz_localize().

Con este, podremos saber que nuestra columna de fecha de inicio tiene un desplazamiento gracias al horario de verano, así que si tratamos de convertir los datos a la zona horaria de ‘America/New_York’, Pandas nos generará un error ambiguo (AmbiguousTimeError)y tendremos una fecha y hora que se produce durante el cambio de horario de verano.

Para evitar esto, podemos usar la cadena ‘NaT’ que nos permite hacerle saber a Pandas que si aparece el error, lo debe convertir en un ‘Not a Time’. De esta manera, cuando volvamos a realizar alguna operación aritmética, Pandas ignorará todas las fechas que produjeron un ‘NaT’ y nos arrojará los resultados del cálculo.

#Tratar de establecer un timezone

rides[‘Start date’] = rides[‘Start date’].dt.localize(‘America/New_York’)

AmbiguousTimeError: Cannot infer dst time from ‘2017–11–05 01:56:50’,

try using the ‘ambiguous argument’

#Tratar con datetimes ambiguos

rides[‘Start date’] = rides[‘Start date’].dt.localize(‘America/New_York’, ambiguous=’NaT’)

Pandas es útil y efectivo

Aunque Pandas se actualiza constantemente, y sus métodos pueden cambiar las características para trabajar con los datos de fechas y horas, también surge con nuevas herramientas que nos facilitan aún más el análisis de estos datos.

Es por esto que en el mundo de la analítica de datos es altamente recomendable conocerlo y utilizarlo con sabiduría.

¿Quieres leer más temas relacionados? 👉Visita el blog de Nowports Tech👈

--

--