- 1 1. Conocimientos básicos que debe saber antes de trabajar con fechas y cadenas en Python
- 2 2. [String → Date] strptime() para crear objetos de fecha
- 3 3. 【Fecha → Cadena】Método para convertir libremente el formato con strftime()
- 4 4. Técnicas de conversión mutua con el formato ISO 8601
- 5 5. Técnicas útiles al trabajar con fechas
- 5.1 Usar timedelta para sumar y restar fechas
- 5.2 Obtener la fecha de hoy, ayer y mañana
- 5.3 Comparación de fechas y cálculo de diferencias (días)
- 5.4 Método para obtener y determinar un día de la semana específico
- 5.5 Detección de años bisiestos y cálculo automático de fin de mes (complementario)
- 5.6 Resumen
- 6 6. Preguntas frecuentes (FAQ)
- 6.1 Q1. ¿Por qué strptime() genera ValueError?
- 6.2 Q2. ¿Por qué los días de la semana aparecen en inglés en lugar de japonés?
- 6.3 Q3. ¿Se puede convertir una fecha en japonés que incluye 「午前」 o 「午後」?
- 6.4 Q4. ¿Cuál es la diferencia entre datetime.now() y datetime.today()?
- 6.5 Q5. No puedo convertir una cadena ISO con zona horaria. ¿Qué debo hacer?
- 6.6 Nota adicional: ¿Qué hacer si la configuración regional japonesa no funciona en Windows?
- 6.7 Resumen
1. Conocimientos básicos que debe saber antes de trabajar con fechas y cadenas en Python
Al procesar fechas y horas en Python, lo más básico es el módulo «datetime
». En este artículo explicaremos en detalle cómo convertir entre fechas y cadenas, pero antes de eso, repasemos los conceptos y clases fundamentales que debe conocer.
¿Qué es la biblioteca estándar de Python datetime
?
En Python, el módulo datetime
está disponible como biblioteca estándar para manejar fechas y horas. No requiere instalación adicional y está listo para usar. Con este módulo, es posible obtener la hora actual, realizar sumas y restas de fechas, convertir formatos, comparar, entre otras operaciones.
Primero, revisemos la forma básica de importarlo.
import datetime
O también puede importar solo las clases necesarias, como se muestra a continuación.
from datetime import datetime, date, time, timedelta
Clases de uso frecuente y sus diferencias
El módulo datetime
contiene varias clases, pero las tres siguientes son las más relevantes para la conversión entre fechas y cadenas.
Clase datetime.date
Clase que representa la información de año, mes y día. No incluye la hora.
d = datetime.date(2025, 4, 7)
print(d) # Salida: 2025-04-07
Clase datetime.time
Clase que contiene solo la información de hora, minutos y segundos. No incluye la fecha.
t = datetime.time(14, 30, 0)
print(t) # Salida: 14:30:00
Clase datetime.datetime
Clase más versátil que puede manejar tanto la fecha (año, mes, día) como la hora (hora, minuto, segundo).
dt = datetime.datetime(2025, 4, 7, 14, 30)
print(dt) # Salida: 2025-04-07 14:30:00
Esta clase es la que se usa con mayor frecuencia para la conversión bidireccional entre cadenas y fechas.
Obtener la fecha y hora actuales con datetime.now()
Usando el método now()
de la clase datetime.datetime
, puede obtener fácilmente la fecha y hora actuales.
from datetime import datetime
now = datetime.now()
print(now) # Ejemplo: 2025-04-07 13:45:12.345678
El objeto datetime
obtenido de esta manera puede convertirse a una cadena o generarse a partir de una cadena usando strftime()
y strptime()
, que se presentarán más adelante.
Resumen
En esta sección se explicó la visión general del módulo datetime
, que es lo más básico para trabajar con fechas y horas en Python, y se describieron las diferencias entre las clases principales. En la siguiente sección nos enfocaremos en la “conversión de cadenas a fechas” y se mostrará el uso concreto de strptime()
.
2. [String → Date] strptime()
para crear objetos de fecha
En Python, para convertir una cadena que representa una fecha a un objeto datetime
, se usa el método strptime()
. Es la abreviatura de «string parse time«, una función que analiza la cadena y la reconoce como una fecha.
En este capítulo, se explican paso a paso desde el uso básico, cómo manejar notaciones en japonés, hasta la solución de errores.
strptime()
uso básico y lista de especificadores de formato
Sintaxis básica
from datetime import datetime
date_string = '2025-04-07'
dt = datetime.strptime(date_string, '%Y-%m-%d')
print(dt) # Salida: 2025-04-07 00:00:00
strptime()
acepta dos argumentos de la siguiente forma:
- Primer argumento: cadena a analizar(ejemplo: ‘2025-04-07’)
- Segundo argumento: formato de la cadena(ejemplo: ‘%Y-%m-%d’)
Especificadores de formato comunes
Especificador | Significado | Ejemplo |
---|---|---|
%Y | Año con siglo (4 dígitos) | 2025 |
%y | Año con siglo (2 dígitos) | 25 |
%m | Mes (2 dígitos) | 04 |
%d | Día (2 dígitos) | 07 |
%H | Hora (24 horas) | 14 |
%M | Minuto | 30 |
%S | Segundo | 59 |
%A | Día de la semana (en inglés) | Monday |
%p | AM/PM | AM |
Otro ejemplo: conversión con fecha y hora
date_string = '2025-04-07 14:30:00'
dt = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
print(dt) # Salida: 2025-04-07 14:30:00
¿Cómo manejar cadenas de fecha con notación japonesa?
Para manejar formatos comunes en japonés como «2025年4月7日» o «2025年04月07日(月)}», se debe ingeniosamente diseñar el formato de la siguiente manera.
Ejemplo de análisis de cadena de fecha con caracteres japoneses
date_string = '2025-04-07'
dt = datetime.strptime(date_string, '%Y-%m-%d')
print(dt) # Salida: 2025-04-07 00:00:00
Las cadenas que incluyen el día de la semana en japonés no son compatibles con strptime()
básico
Por ejemplo, una cadena como «2025年4月7日(月)» producirá un error si se pasa directamente a strptime()
. Esto se debe a que strptime()
de Python depende de la configuración regional y no admite de forma predeterminada los días de la semana en japonés.
En este caso, se pueden aplicar las siguientes soluciones:
- Eliminar la parte del día de la semana en japonés de la cadena antes de pasarla a
strptime()
- Utilizar una biblioteca externa (por ejemplo,
kanji_to_time
)
Errores comunes y su solución: ValueError
strptime()
El error más frecuente al usar strptime()
es el siguiente.
ValueError: time data '2025/04/07' does not match format '%Y-%m-%d'
¿Cuál es la causa de este error?
Esto ocurre porque el formato real de la cadena no coincide con el formato especificado.
Por ejemplo, si se desea procesar la fecha '2025/04/07'
, el formato también debe usar la barra diagonal.
date_string = '2025/04/07'
dt = datetime.strptime(date_string, '%Y/%m/%d')
Puntos de solución de problemas
- Verificar el separador (‑, /, espacio, etc.)
- Comprobar si hay ceros a la izquierda (ejemplo: ’04’ vs ‘4’)
- Asegurarse de que no haya información extra, como el día de la semana, que
strptime()
no pueda procesar
3. 【Fecha → Cadena】Método para convertir libremente el formato con strftime()
Al trabajar con fechas en Python, hay muchas situaciones en las que se desea convertir el objeto datetime
a una cadena con un formato específico. En esos casos, el método strftime()
es útil.
En este capítulo, se explican el uso básico de strftime()
, los especificadores de formato más comunes y cómo mostrar los nombres de los días de la semana y los meses en japonés.
Uso básico de strftime()
Sintaxis y ejemplo sencillo
from datetime import datetime
dt = datetime(2025, 4, 7, 14, 30)
formatted = dt.strftime('%Y-%m-%d %H:%M:%S')
print(formatted) # Salida: 2025-04-07 14:30:00
strftime()
es la abreviatura de “string format time” y convierte el objeto datetime
a una cadena con el formato especificado.
Especificadores de formato más usados (repetición)
Especificador | Significado | Ejemplo |
---|---|---|
%Y | Año (4 dígitos) | 2025 |
%m | Mes (2 dígitos) | 04 |
%d | Día (2 dígitos) | 07 |
%H | Hora (24h) | 14 |
%M | Minuto | 30 |
%S | Segundo | 00 |
%A | Día de la semana (inglés) | Monday |
%a | Día de la semana (abreviado) | Mon |
%p | AM/PM | PM |
Ejemplo práctico: personalizar libremente el formato
Mostrar año, mes y día separados por barras
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y/%m/%d')
print(formatted) # Salida: 2025/04/07
Convertir al formato estilo japonés
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y año%m mes%d día')
print(formatted) # Salida: 2025 año04 mes07 día
Mostrar detalles con hora
dt = datetime(2025, 4, 7, 14, 30)
formatted = dt.strftime('%Y año%m mes%d día %H hora%M minuto')
print(formatted) # Salida: 2025 año04 mes07 día 14 hora30 minuto
Cuando se desea mostrar los días de la semana en japonés
Usando strftime('%A')
se pueden mostrar los días de la semana, pero por defecto aparecen en inglés. Para mostrarlos en japonés, es necesario cambiar la configuración regional (locale).
Ejemplo usando el módulo locale (para entornos UNIX/Linux)
import locale
from datetime import datetime
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y año %m mes %d día (%A)')
print(formatted) # Salida: 2025 año 04 mes 07 día (lunes)
Puntos a considerar
- En entornos Windows, puede que
'ja_JP.UTF-8'
no esté disponible. - Debido a la dependencia del entorno, evite codificar valores fijos en aplicaciones web o código distribuido.
- Si prioriza la estabilidad, también puede mapear los días de la semana mediante un diccionario propio.
weekdays = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']
weekday = weekdays[dt.weekday()]
print(f"{dt.strftime('%Y-%m-%d')}({weekday})")
Resumen
En este capítulo se presentó el uso y ejemplos de strftime()
como método para convertir objetos datetime
a cadenas. La capacidad de personalizar libremente el formato de salida es muy útil en diversas situaciones, como la visualización de datos de fechas y la generación de logs.
En el próximo capítulo se explicará la conversión mutua con el formato de fecha estandarizado “ISO 8601”.

4. Técnicas de conversión mutua con el formato ISO 8601
En la integración de datos entre sistemas y en la comunicación API, es común intercambiar fechas y horas en el “formato ISO 8601”. En Python, la conversión con este formato también es una de las operaciones más importantes.
En este capítulo, se explica cómo realizar conversiones mutuas con el formato ISO 8601 en Python y cómo manejar cadenas con zona horaria.
¿Qué es el formato ISO 8601?
El formato ISO 8601 es la regla de notación de fechas y horas establecida por la Organización Internacional de Normalización (ISO). Se representa de la siguiente manera:
2025-04-07T14:30:00
- Insertar una «T» entre la fecha y la hora
- Notación de 24 horas
- Puede incluir información de zona horaria (p. ej.,
+09:00
oZ
)
Este formato se usa ampliamente en tipos de datos como JSON y XML, REST API, archivos de registro, entre otros.
Convertir fecha a cadena en formato ISO con isoformat()
Los objetos datetime
Python incluyen el práctico método isoformat()
.
Ejemplo de uso
from datetime import datetime
dt = datetime(2025, 4, 7, 14, 30)
iso_str = dt.isoformat()
print(iso_str) # Salida: 2025-04-07T14:30:00
Ajustes finos mediante argumentos
# Mostrar hasta milisegundos
print(dt.isoformat(timespec='milliseconds')) # 2025-04-07T14:30:00.000
# Obtener solo la fecha
print(dt.date().isoformat()) # 2025-04-07
Convertir cadena ISO a objeto datetime con fromisoformat()
Por el contrario, para generar un objeto datetime
a partir de una cadena en formato ISO 8601, se usa fromisoformat()
.
Ejemplo de uso
iso_str = '2025-04-07T14:30:00'
dt = datetime.fromisoformat(iso_str)
print(dt) # Salida: 2025-04-07 14:30:00
Es muy intuitivo y está soportado a partir de Python 3.7.
Cómo manejar cadenas ISO que incluyen información de zona horaria
El fromisoformat()
estándar puede no manejar correctamente las cadenas que incluyen información de zona horaria (p. ej., +09:00
o Z
). En esos casos, usar una biblioteca de terceros brinda mayor flexibilidad.
Biblioteca recomendada: dateutil.parser
pip install python-dateutil
Ejemplo de uso
from dateutil import parser
iso_str = '2025-04-07T14:30:00+09:00'
dt = parser.parse(iso_str)
print(dt) # Salida: 2025-04-07 14:30:00+09:00
De esta manera, también se pueden analizar con precisión cadenas ISO con zona horaria.
Nota adicional: diferencia entre UTC y notación Z
Z
es una abreviatura que significa “Zulu Time (UTC)”.2025-04-07T14:30:00Z
representa una hora en UTC (Tiempo Universal Coordinado).
Como el fromisoformat()
estándar de Python no admite la notación Z
, se recomienda nuevamente usar dateutil.parser
.
Resumen
El formato ISO 8601 es esencial para el intercambio de datos de fechas y horas. En Python, se pueden convertir fácilmente usando isoformat()
y fromisoformat()
, pero al manejar cadenas con zona horaria, el uso de la biblioteca externa dateutil
es muy útil.
En el próximo capítulo, se presentarán técnicas avanzadas útiles en la práctica, como cálculos y comparaciones de fechas, y cómo obtener diferencias.
5. Técnicas útiles al trabajar con fechas
Al trabajar con fechas y horas, no solo se convierte el formato, sino que también se utilizan frecuentemente operaciones como comparación de fechas y sumas y restas de fechas.
En este capítulo, se explican principalmente técnicas útiles en la práctica dentro del módulo datetime
.
Usar timedelta
para sumar y restar fechas
Para calcular fechas como “un día después”, “una semana antes”, “30 días después”, se utiliza la clase datetime.timedelta
.
Obtener un día después o un día antes
from datetime import datetime, timedelta
today = datetime(2025, 4, 7)
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)
print(tomorrow) # Salida: 2025-04-08 00:00:00
print(yesterday) # Salida: 2025-04-06 00:00:00
También es posible sumar y restar en unidades de tiempo
dt = datetime(2025, 4, 7, 14, 30)
plus_2_hours = dt + timedelta(hours=2)
print(plus_2_hours) # Salida: 2025-04-07 16:30:00
Obtener la fecha de hoy, ayer y mañana
Obtener fechas relativas basadas en la fecha y hora actual es un patrón muy común.
from datetime import datetime, timedelta
now = datetime.now()
today = now.date()
yesterday = today - timedelta(days=1)
tomorrow = today + timedelta(days=1)
print(f"Hoy: {today}")
print(f"Ayer: {yesterday}")
print(f"Mañana: {tomorrow}")
Con esto, funciones como informes diarios o programadores pueden implementarse fácilmente.
Comparación de fechas y cálculo de diferencias (días)
También es posible calcular la relación temporal entre dos fechas y la diferencia (días, horas, etc.).
Comparación de fechas (relación de orden)
d1 = datetime(2025, 4, 7)
d2 = datetime(2025, 4, 10)
print(d1 < d2) # Salida: True
Calcular la diferencia (uso de timedelta)
delta = d2 - d1
print(delta.days) # Salida: 3
De esta manera, la diferencia se obtiene como un objeto timedelta
, y sus atributos .days
y .seconds
permiten obtener los valores con detalle.
Método para obtener y determinar un día de la semana específico
Para obtener el día de la semana a partir de una fecha o determinar si es un día específico, se usan .weekday()
y .isoweekday()
.
Método | Salida (ejemplo: lunes) |
---|---|
.weekday() | 0 (= lunes) |
.isoweekday() | 1 (= lunes) |
d = datetime(2025, 4, 7) # Lunes
print(d.weekday()) # Salida: 0
print(d.isoweekday()) # Salida: 1
Método para mostrar los días de la semana en japonés (mapeo mediante diccionario)
weekdays = ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo']
weekday_jp = weekdays[d.weekday()]
print(f"{d.strftime('%Y/%m/%d')}({weekday_jp})")
Detección de años bisiestos y cálculo automático de fin de mes (complementario)
import calendar
# Determinar si es año bisiesto
print(calendar.isleap(2024)) # Salida: True
# Obtener la fecha del último día del mes
last_day = calendar.monthrange(2025, 4)[1]
print(last_day) # Salida: 30
Resumen
En este capítulo se presentaron sumas y restas de fechas, comparaciones, cálculo de diferencias y determinación de días de la semana, que son comunes en la práctica. En particular, el uso de timedelta
es muy versátil y se recomienda memorizarlo como una habilidad básica de manejo de fechas.
En el siguiente capítulo se recopilan Preguntas frecuentes (FAQ) relacionadas con lo explicado hasta ahora, proporcionando información útil para resolver dudas.
6. Preguntas frecuentes (FAQ)
Al trabajar con fechas y cadenas en Python, hemos recopilado en formato de preguntas frecuentes los puntos en los que los principiantes suelen tropezar. Úselo para resolver problemas y reforzar la comprensión.
Q1. ¿Por qué strptime()
genera ValueError
?
A. Es muy probable que el formato no coincida.
En strptime()
, si la cadena y el formato especificado difieren aunque sea en un carácter, se produce un error.
Ejemplo: caso no válido
from datetime import datetime
date_string = '2025/04/07'
# El formato es '-' y no coincide
dt = datetime.strptime(date_string, '%Y-%m-%d')
# → ValueError ocurre
Ejemplo corregido:
dt = datetime.strptime(date_string, '%Y/%m/%d')
Además, pueden considerarse las siguientes causas:
- Presencia o ausencia de ceros a la izquierda (04 vs 4)
- Caracteres extra (p.ej., día de la semana o espacios)
- Formato no soportado (por ejemplo, los japoneses 「午前・午後」)
Q2. ¿Por qué los días de la semana aparecen en inglés en lugar de japonés?
A. strftime('%A')
depende de la configuración regional (idioma).
Como la configuración predeterminada de Python usa el inglés, el día obtenido con %A
será Monday
, etc.
Solución 1: usar el módulo locale
(UNIX/Linux)
import locale
from datetime import datetime
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
dt = datetime(2025, 4, 7)
print(dt.strftime('%A')) # Salida: lunes
Solución 2: mapear los días de la semana a japonés mediante un diccionario (independiente del entorno)
weekdays = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']
print(weekdays[dt.weekday()]) # Salida: Lunes
Q3. ¿Se puede convertir una fecha en japonés que incluye 「午前」 o 「午後」?
A. La strptime()
estándar de Python no lo soporta.
Por ejemplo, la cadena '2025年4月7日 午後2時30分'
produciría un error con la strptime()
estándar.
Métodos de solución:
- Usar expresiones regulares propias para convertir 「午前/午後」 a hora
- Utilizar una biblioteca externa (p.ej.,
dateparser
)
pip install dateparser
import dateparser
s = '7 de abril de 2025 2:30 p.m.'
dt = dateparser.parse(s)
print(dt) # Salida: 2025-04-07 14:30:00
Q4. ¿Cuál es la diferencia entre datetime.now()
y datetime.today()
?
A. Son esencialmente lo mismo (en datetime.datetime
).
from datetime import datetime
print(datetime.now()) # Obtener la fecha y hora actual
print(datetime.today()) # Obtener la fecha y hora actual de la misma manera
Ambos devuelven la hora local actual. Aunque la documentación de Python describe diferencias precisas, para usos habituales se pueden considerar con el mismo comportamiento sin problemas.
Q5. No puedo convertir una cadena ISO con zona horaria. ¿Qué debo hacer?
A. datetime.fromisoformat()
no soporta algunas cadenas con zona horaria.
Ejemplo: 2025-04-07T14:30:00+09:00
, etc.
Solución: usar dateutil.parser.parse()
from dateutil import parser
s = '2025-04-07T14:30:00+09:00'
dt = parser.parse(s)
print(dt) # Salida: 2025-04-07 14:30:00+09:00
Con la biblioteca dateutil
, puede manejar de forma flexible cadenas con zona horaria.
Nota adicional: ¿Qué hacer si la configuración regional japonesa no funciona en Windows?
Si locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
falla, el nombre de la configuración regional en Windows será algo como Japanese_Japan.932
.
locale.setlocale(locale.LC_TIME, 'Japanese_Japan.932')
No obstante, debido a variaciones entre entornos, el mapeo mediante diccionario es más fiable.
Resumen
En este FAQ hemos explicado los errores y puntos confusos más comunes con ejemplos concretos. Si se resuelven estas dudas, ganará considerable confianza al manejar fechas y cadenas en Python.