31/10/2023
En el vasto universo de la programación, el manejo de fechas y horas es una tarea recurrente y, a menudo, crucial. Ya sea para registrar eventos, programar tareas o analizar tendencias temporales, saber manipular y extraer información de las fechas es una habilidad indispensable. Python, con su filosofía de 'baterías incluidas', nos ofrece herramientas robustas y eficientes para esta labor, destacando el potente módulo datetime. Esta guía te sumergirá en el corazón de la manipulación de fechas en Python, enseñándote no solo a determinar el día de la semana, sino también a entender cómo interactúan los objetos temporales y cómo extraer datos significativos de ellos. Prepárate para contar el tiempo con precisión y eficiencia.

- El Módulo datetime: Tu Aliado Temporal
- Descifrando el Día de la Semana con datetime
- Más Allá de datetime: Otras Herramientas para el Día de la Semana
- Manejo de Duraciones con timedelta
- Formato de Fechas: strftime()
- El Poder de Pandas en el Análisis de Fechas
- Preguntas Frecuentes (FAQ)
- ¿Cuál es la diferencia principal entre datetime.weekday() y datetime.isoweekday()?
- ¿Por qué mi código Pandas da un AttributeError al intentar obtener el día de la semana?
- ¿Cómo puedo obtener el día de la semana en español o en otro idioma?
- ¿Cuál es la forma más eficiente de calcular la diferencia entre dos fechas en Python?
- Conclusión
El Módulo datetime: Tu Aliado Temporal
El módulo datetime es la piedra angular para el manejo de fechas y horas en Python. Proporciona clases para manipular fechas y horas de una manera tanto simple como compleja, permitiendo operaciones aritméticas y formateo de cadenas. Es el punto de partida para cualquier tarea relacionada con el tiempo en tus proyectos.
De Cadena a Objeto datetime con strptime()
Con frecuencia, las fechas nos llegan en formato de texto. Para poder realizar operaciones y extraer información de estas cadenas, es necesario convertirlas a un objeto datetime. Aquí es donde strptime() brilla. Esta función toma una cadena de texto que representa una fecha y una cadena de formato que le indica a Python cómo interpretar esa fecha. Es crucial que el formato proporcionado coincida exactamente con la estructura de la cadena de fecha.
Veamos un ejemplo práctico:
from datetime import datetime cadena_fecha = "21-02-2021 18:46:00" formato = "%d-%m-%Y %H:%M:%S" objeto_datetime = datetime.strptime(cadena_fecha, formato) print(f"Cadena original: {cadena_fecha}") print(f"Objeto datetime: {objeto_datetime}") print(f"Tipo del objeto: {type(objeto_datetime)}")En este fragmento, la cadena "21-02-2021 18:46:00" se transforma en un objeto datetime, permitiéndonos manipularla. Las directivas de formato son claves para esta conversión. Algunas de las más útiles incluyen:
%d: Día del mes como número decimal (01, 02, ..., 31).%m: Mes como número decimal (01, 02, ..., 12).%Y: Año con el siglo como número decimal (2021, 1999).%H: Hora (reloj de 24 horas) como número decimal (00, 01, ..., 23).%M: Minuto como número decimal (00, 01, ..., 59).%S: Segundo como número decimal (00, 01, ..., 59).
Obteniendo la Marca de Tiempo Actual
En muchas aplicaciones, necesitas registrar el momento exacto en que ocurre un evento, como la creación de un registro en una base de datos. Para obtener la fecha y hora actuales, el módulo datetime ofrece una solución directa y elegante:
from datetime import datetime marca_tiempo_actual = datetime.now() print(f"La marca de tiempo actual es: {marca_tiempo_actual}")Esta simple línea de código te proporciona un objeto datetime que representa el instante exacto en que se ejecuta, incluyendo microsegundos.
Descifrando el Día de la Semana con datetime
Una de las preguntas más comunes al trabajar con fechas es: ¿qué día de la semana es esta fecha? El módulo datetime ofrece dos métodos principales para responder a esta pregunta: weekday() e isoweekday().
El Método weekday()
El método weekday() de un objeto datetime devuelve un entero que representa el día de la semana. La numeración comienza en 0 para el lunes y termina en 6 para el domingo.
from datetime import datetime # Fecha de ejemplo: 22 de febrero de 2003 fecha_ejemplo = datetime.strptime("22 02 2003", "%d %m %Y") dia_numero = fecha_ejemplo.weekday() dias_semana = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo'] nombre_dia = dias_semana[dia_numero] print(f"La fecha {fecha_ejemplo.strftime('%d-%m-%Y')} fue un: {nombre_dia} (índice: {dia_numero})") # Salida esperada: Sábado (índice: 5)El Método isoweekday()
Similar a weekday(), el método isoweekday() también devuelve un entero para el día de la semana, pero sigue el estándar ISO 8601. Esto significa que el lunes es 1 y el domingo es 7.
from datetime import datetime # Fecha de ejemplo: 22 de diciembre de 2002 fecha_ejemplo = datetime.strptime("22 12 2002", "%d %m %Y") dia_numero_iso = fecha_ejemplo.isoweekday() dias_semana_iso = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo'] # Para usar con una lista 0-indexada, restamos 1 nombre_dia_iso = dias_semana_iso[dia_numero_iso - 1] print(f"La fecha {fecha_ejemplo.strftime('%d-%m-%Y')} fue un: {nombre_dia_iso} (índice ISO: {dia_numero_iso})") # Salida esperada: Domingo (índice ISO: 7)Tabla Comparativa: weekday() vs isoweekday()
Es importante entender la diferencia entre estos dos métodos para elegir el que mejor se adapte a tus necesidades o al estándar que estés siguiendo.
| Método | Lunes | Martes | Miércoles | Jueves | Viernes | Sábado | Domingo | Estándar |
|---|---|---|---|---|---|---|---|---|
weekday() | 0 | 1 | 2 | 3 | 4 | 5 | 6 | Python (0-indexado) |
isoweekday() | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ISO 8601 (1-indexado) |
Más Allá de datetime: Otras Herramientas para el Día de la Semana
Aunque datetime es la opción principal, Python ofrece otras formas de calcular el día de la semana, que pueden ser útiles en contextos específicos o para comprender las bases de estos cálculos.
Usando calendar.weekday()
El módulo calendar también proporciona una función weekday(), que es similar a datetime.weekday() en su comportamiento de numeración (0=Lunes, 6=Domingo), pero opera directamente con los números del año, mes y día.

import calendar dia = 3 mes = 2 ano = 2019 dia_numero_cal = calendar.weekday(ano, mes, dia) dias_semana = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo'] nombre_dia_cal = dias_semana[dia_numero_cal] print(f"La fecha {dia:02d}-{mes:02d}-{ano} fue un: {nombre_dia_cal} (índice: {dia_numero_cal})") # Salida esperada: Domingo (índice: 6)La Congruencia de Zeller: Un Cálculo Manual
Para aquellos interesados en la teoría detrás de los cálculos de fechas, la Congruencia de Zeller es un algoritmo que permite determinar el día de la semana para cualquier fecha gregoriana. Aunque no es práctico para el uso diario en Python (ya que las bibliotecas lo hacen por ti), es fascinante entender cómo se puede lograr esto manualmente.
# Implementación simplificada de la Congruencia de Zeller d = "30 12 2003" q, m, y = map(int, d.split()) # día, mes, año # Enero y Febrero son tratados como meses 13 y 14 del año anterior para la fórmula if m < 3: m += 12 y -= 1 k = y % 100 # parte del año (últimos dos dígitos) j = y // 100 # siglo # Fórmula de Zeller h = (q + (13 * (m + 1)) // 5 + k + k // 4 + j // 4 + 5 * j) % 7 # Mapeo de la salida de Zeller (0 = Sábado, ..., 6 = Viernes) wd = ['Sábado', 'Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes'] print(f"La fecha {d} fue un: {wd[h]}") # Salida esperada: MartesEste método es una excelente forma de apreciar la complejidad que las bibliotecas de Python simplifican para nosotros.
Manejo de Duraciones con timedelta
Más allá de saber el día de la semana, a menudo necesitamos calcular la duración entre dos fechas o agregar/restar tiempo a una fecha existente. Para esto, Python nos ofrece el objeto timedelta.
Un objeto timedelta representa una duración, la diferencia entre dos instantes de tiempo. Puedes crear objetos timedelta especificando días, segundos, microsegundos, milisegundos, minutos, horas o semanas. Por defecto, todos los valores son cero.
from datetime import datetime, timedelta fecha_inicio = datetime(2023, 1, 1, 10, 0, 0) fecha_fin = datetime(2023, 1, 3, 14, 30, 0) # Calculando la diferencia entre dos fechas diferencia = fecha_fin - fecha_inicio print(f"Diferencia entre fechas: {diferencia}") # Accediendo a componentes de timedelta print(f"Días: {diferencia.days}") print(f"Segundos totales: {diferencia.total_seconds()}") # Creando un timedelta y sumándolo a una fecha duracion_semana = timedelta(weeks=1) fecha_futura = fecha_inicio + duracion_semana print(f"Fecha una semana después: {fecha_futura}") duracion_horas = timedelta(hours=4, minutes=15) fecha_mas_horas = fecha_inicio + duracion_horas print(f"Fecha más 4 horas y 15 minutos: {fecha_mas_horas}")Es importante notar que timedelta internamente solo almacena días, segundos y microsegundos. Si especificas horas o minutos, se convierten a segundos. Para obtener la diferencia total en horas o minutos, debes convertir la duración total a segundos y luego dividir.
Formato de Fechas: strftime()
Así como strptime() convierte una cadena a un objeto datetime, strftime() hace lo contrario: convierte un objeto datetime de vuelta a una cadena de texto, permitiéndote especificar el formato de salida deseado. Esto es increíblemente útil para presentar fechas en informes, interfaces de usuario o para exportar datos.
from datetime import datetime fecha_actual = datetime.now() # Formato ISO (por defecto si imprimes el objeto directamente) print(f"Formato ISO: {fecha_actual}") # Formato personalizado: Día/Mes/Año Hora:Minuto:Segundo formato_personalizado = fecha_actual.strftime("%d/%m/%Y %H:%M:%S") print(f"Formato personalizado: {formato_personalizado}") # Obteniendo el nombre completo del día de la semana nombre_dia_completo = fecha_actual.strftime("%A") print(f"Día de la semana completo: {nombre_dia_completo}") # Obteniendo el nombre abreviado del día de la semana nombre_dia_abreviado = fecha_actual.strftime("%a") print(f"Día de la semana abreviado: {nombre_dia_abreviado}") # Fecha en formato de texto legible fecha_legible = fecha_actual.strftime("Hoy es %A, %d de %B de %Y") print(f"Fecha legible: {fecha_legible}")Las directivas como %A (nombre completo del día de la semana) y %a (nombre abreviado) son particularmente útiles para nuestros propósitos en este artículo.
El Poder de Pandas en el Análisis de Fechas
Si trabajas con conjuntos de datos extensos en campos como la ciencia de datos o la ingeniería de software, es muy probable que encuentres fechas y horas como parte de tus columnas. La librería Pandas es la herramienta de facto en Python para la manipulación y análisis de datos tabulares. Pandas extiende las capacidades de datetime, haciéndolas mucho más eficientes para operaciones a gran escala en columnas enteras.
Convertir Columnas a Tipo datetime
Antes de poder extraer información de una columna de fechas en Pandas, es fundamental asegurarse de que la columna sea de tipo datetime. Pandas facilita esto con la función pd.to_datetime().

import pandas as pd df = pd.DataFrame({ 'fecha_string': ['2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-06-05'], 'valor': [10, 15, 20, 25, 30] }) print("DataFrame original:") print(df) print(f"Tipo de la columna 'fecha_string' antes de la conversión: {df['fecha_string'].dtype}") # Convertir la columna 'fecha_string' a tipo datetime df['fecha'] = pd.to_datetime(df['fecha_string']) print("\nDataFrame después de la conversión:") print(df) print(f"Tipo de la columna 'fecha' después de la conversión: {df['fecha'].dtype}")Una vez que la columna es de tipo datetime, podemos usar el 'accessor' .dt para acceder a todas las propiedades y métodos relacionados con fechas y horas.
Método 1: Usando dt.day_name()
Este es, quizás, el método más directo y legible en Pandas para obtener el nombre del día de la semana. Devuelve una Serie con el nombre del día de la semana para cada entrada.
import pandas as pd df = pd.DataFrame({ 'fecha': ['2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-06-05'] }) df['fecha'] = pd.to_datetime(df['fecha']) df['dia_semana_nombre'] = df['fecha'].dt.day_name() print("DataFrame con día de la semana por nombre:") print(df)Salida:
fecha dia_semana_nombre 0 2021-06-01 Tuesday 1 2021-06-02 Wednesday 2 2021-06-03 Thursday 3 2021-06-04 Friday 4 2021-06-05 SaturdayMétodo 2: Usando dt.weekday y Mapeo
Al igual que con el objeto datetime nativo, puedes usar .dt.weekday para obtener el día de la semana como un entero (0=Lunes, 6=Domingo) y luego mapearlo a nombres de días si lo deseas. Esto es útil si necesitas el valor numérico para alguna lógica de negocio.
import pandas as pd df = pd.DataFrame({ 'fecha': ['2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-06-05'] }) df['fecha'] = pd.to_datetime(df['fecha']) dias_mapa = { 0: 'Lunes', 1: 'Martes', 2: 'Miércoles', 3: 'Jueves', 4: 'Viernes', 5: 'Sábado', 6: 'Domingo' } df['dia_semana_num'] = df['fecha'].dt.weekday df['dia_semana_mapeado'] = df['fecha'].dt.weekday.map(dias_mapa) print("DataFrame con día de la semana por número y mapeado:") print(df)Salida:
fecha dia_semana_num dia_semana_mapeado 0 2021-06-01 1 Martes 1 2021-06-02 2 Miércoles 2 2021-06-03 3 Jueves 3 2021-06-04 4 Viernes 4 2021-06-05 5 SábadoMétodo 3: Usando dt.strftime('%A')
Si deseas un control más granular sobre el formato de la cadena del día de la semana (por ejemplo, para obtener el nombre completo o abreviado en el idioma del sistema), puedes usar .dt.strftime() con la directiva %A (para el nombre completo del día) o %a (para el nombre abreviado).
import pandas as pd df = pd.DataFrame({ 'fecha': ['2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-06-05'] }) df['fecha'] = pd.to_datetime(df['fecha']) df['dia_semana_strftime'] = df['fecha'].dt.strftime('%A') print("DataFrame con día de la semana usando strftime:") print(df)Salida:
fecha dia_semana_strftime 0 2021-06-01 Tuesday 1 2021-06-02 Wednesday 2 2021-06-03 Thursday 3 2021-06-04 Friday 4 2021-06-05 SaturdayErrores Comunes y Soluciones en Pandas
El error más frecuente al trabajar con fechas en Pandas es el AttributeError: Can only use .dt accessor with datetimelike values. Esto ocurre cuando intentas usar el accessor .dt en una columna que no ha sido convertida al tipo datetime.
import pandas as pd df_error = pd.DataFrame({'fecha_str': ['2023-01-01', '2023-01-02']}) # Esto causaría un AttributeError si 'fecha_str' no es datetime # df_error['dia'] = df_error['fecha_str'].dt.day_name()Solución: Asegúrate siempre de convertir la columna a datetime utilizando pd.to_datetime() antes de intentar acceder a sus propiedades temporales.
df_solucion = pd.DataFrame({'fecha_str': ['2023-01-01', '2023-01-02']}) df_solucion['fecha'] = pd.to_datetime(df_solucion['fecha_str']) df_solucion['dia'] = df_solucion['fecha'].dt.day_name() print(df_solucion)Buenas Prácticas en el Manejo de Fechas con Pandas
- Consistencia en el Formato: Asegúrate de que todas las fechas en tu columna sigan un formato consistente. Esto previene errores durante la conversión con
pd.to_datetime(). - Manejo de Valores Nulos: Antes de realizar operaciones, verifica y decide cómo manejar los valores nulos (NaN) en tus columnas de fecha. Puedes eliminarlos con
df.dropna(subset=['nombre_columna_fecha'])o rellenarlos adecuadamente. - Zona Horaria: Para aplicaciones globales, considera el manejo de zonas horarias. Python
datetimey Pandas soportan zonas horarias, lo cual es crucial para la precisión.
Preguntas Frecuentes (FAQ)
¿Cuál es la diferencia principal entre datetime.weekday() y datetime.isoweekday()?
La diferencia principal radica en el índice de inicio y el día que representan. weekday() retorna 0 para lunes y 6 para domingo. isoweekday(), siguiendo el estándar ISO 8601, retorna 1 para lunes y 7 para domingo.
¿Por qué mi código Pandas da un AttributeError al intentar obtener el día de la semana?
Este error, AttributeError: Can only use .dt accessor with datetimelike values, ocurre porque la columna en la que estás intentando usar el accessor .dt no es de tipo datetime. Debes convertirla explícitamente usando pd.to_datetime() antes de intentar acceder a sus propiedades temporales.
¿Cómo puedo obtener el día de la semana en español o en otro idioma?
Por defecto, strftime('%A') y dt.day_name() pueden devolver los nombres de los días en inglés. Para obtenerlos en español, puedes:
- Mapeo manual: Como se mostró en los ejemplos de
weekday(), puedes crear una lista o diccionario de nombres de días en español y usar el índice numérico retornado porweekday()oisoweekday()para obtener el nombre. - Configurar el locale: Para
strftime(), puedes configurar el locale del sistema Python a español. Sin embargo, esto afecta a todo el programa y puede no ser ideal en todos los entornos. Por ejemplo:import locale; locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8')(el nombre del locale puede variar según el sistema operativo).
¿Cuál es la forma más eficiente de calcular la diferencia entre dos fechas en Python?
La forma más eficiente y recomendada es restar directamente dos objetos datetime. El resultado será un objeto timedelta, que representa la duración entre las dos fechas. Puedes luego usar sus propiedades como .days o .total_seconds() para obtener la diferencia en las unidades deseadas.
Conclusión
Hemos recorrido un camino completo, desde los fundamentos del módulo datetime de Python hasta el manejo avanzado de fechas en Pandas. Ahora tienes las herramientas necesarias para analizar fechas, extraer el día de la semana, manejar duraciones con timedelta y formatear tus salidas según tus necesidades. La capacidad de manipular y comprender los datos temporales es una habilidad invaluable en el mundo de la programación y el análisis de datos. Esperamos que esta guía te haya proporcionado una base sólida para tus futuros proyectos. ¡Sigue explorando y divirtiéndote con el fascinante mundo del tiempo en Python!
Si quieres conocer otros artículos parecidos a ¿Cómo saber el día de la semana en Python? puedes visitar la categoría Cálculos.
