Convertir un string en fecha en Python

Cómo convertir un string en fecha en Python

A la hora de programar hay ocasiones en que nos toca convertir un string en fecha (un objeto de tipo date, datetime o time). Por ejemplo: al procesar los datos de entrada que un usuario introduce por teclado, al obtener los parámetros de una petición web o al leer datos de un fichero de texto.

En todos los casos anteriores nos podemos encontrar con fechas/horas cuyo tipo real es string. Sin embargo, necesitamos convertirlas a un tipo de fecha/hora correcto (datetime, date o time) para poder realizar operaciones sobre ellas: sumar o restar días, obtener el día de la semana, etc.

En este post aprenderás cómo convertir un string a un objeto de tipo fecha/hora.

Cómo convertir un string en fecha

Para convertir un string en un objeto de tipo fecha equivalente tienes que hacer uso del método strptime() de la clase datetime. Este método devuelve siempre un objeto datetime a partir de una cadena con un formato específico.

❗️NOTA: No se puede convertir cualquier objeto de tipo string a un objeto datetime. La cadena debe tener un formato definido con antelación.

El método strptime() toma dos argumentos. El primero de ellos es la cadena a convertir y el segundo el formato que sigue dicha cadena. Para definir el formato se puede hacer uso de unos códigos de formato que te enseñaré más adelante. Antes, veamos unos ejemplos.

Ejemplo 1: Transformar un string en datetime

Supongamos que queremos convertir la cadena '20/04/2019' en un objeto datetime equivalente. Los pasos que tenemos que seguir son los siguientes (recuerda importar primero la clase datetime del módulo datetime):

from datetime import datetime

# Convertimos un string con formato <día>/<mes>/<año> en datetime
una_fecha = '20/04/2019'
fecha_dt = datetime.strptime(una_fecha, '%d/%m/%Y')
print(fecha_dt)

> 2019-04-20 00:00:00

# Comprobación del tipo del objeto fecha_dt
print(type(fecha_dt))
<class 'datetime.datetime'>

Como puedes ver en el ejemplo, el objeto datetime que se crea inicializa a 0 los campos relacionados con la hora dado que no se han especificado.

Ejemplo 2: Pasar un string a datetime (otro formato distinto)

Veamos otro ejemplo con un formato de fecha/hora algo más complejo.

# Convertimos un string con formato
# <día> del <mes> de <año> a las <hora>:<minutos> en datetime
una_fecha = '20 del 04 de 2019 a las 12:00'
fecha_dt = datetime.strptime(una_fecha, '%d del %m de %Y a las %H:%M')
print(fecha_dt)

> 2019-04-20 12:00:00

ValueError al convertir un string

Como te indicaba más arriba, la cadena a convertir debe tener un formato específico. Concretamente debe seguir el formato que se indica en el segundo parámetro con el que se llama a strptime(). En caso contrario, al llamar al método strptime() se lanzará una excepción ValueError.

una_fecha = '20/04/2019'
fecha_dt = datetime.strptime(una_fecha, '%d-%m-%Y')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py", line 577, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py", line 359, in _strptime
    (data_string, format))
ValueError: time data '20/04/2019' does not match format '%d-%m-%Y'

¡OJO! También te puede interesar Cómo convertir un objeto date en string

Códigos de formato

A continuación se muestran los códigos de formato válidos que puedes usar para convertir un string en fecha (para aquellas plataformas con una implementación estándar de C).

DirectivaSignificadoEjemplo
%aNombre abreviado del día de la semanaSun, Mon, …
%ANombre completo del día de la semanaSunday, Monday, …
%wDía de la semana como número decimal (domingo es 0)0, 1, …, 6
%dDía del mes como número decimal (añade cero delante)01, 02, …, 31
%-dDía del mes como número decimal1, 2, …, 30
%bNombre del mes abreviadoJan, Feb, …, Dec
%BNombre del mes completo.January, February, …
%mMes como número decimal (añade cero delante)01, 02, …, 12
%-mMes como número decimal1, 2, …, 12
%yAño sin siglo como número decimal (añade cero delante)00, 01, …, 99
%-yAño sin siglo como número decimal0, 1, …, 99
%YAño con siglo como número decimal2013, 2019 etc.
%HHora (24 horas) como número decimal (añade cero delante)00, 01, …, 23
%-HHora (24 horas) como número decimal0, 1, …, 23
%IHora (12 horas) como número decimal (añade cero delante)01, 02, …, 12
%-IHora (12 horas) como número decimal1, 2, … 12
%pAM o PM localesAM, PM
%MMinuto como número decimal (añade cero delante)00, 01, …, 59
%-MMinuto como número decimal0, 1, …, 59
%SSegundo como número decimal (añade cero delante)00, 01, …, 59
%-SSegundo como número decimal0, 1, …, 59
%fMicrosegundos como número decimal (añade ceros delante)000000 – 999999
%zCompensación UTC con formato +HHMM o -HHMM 
%ZNombre de la zona horaria 
%jDía del año como número decimal (añade cero delante)001, 002, …, 366
%-jDía del año como número decimal1, 2, …, 366
%UNúmero de semana del año (domingo como primer día de la semana). Los días de un nuevo año anteriores al primer domingo se consideran en la semana 0.00, 01, …, 53
%WNúmero de semana del año (lunes como primer día de la semana). Los días de un nuevo año anteriores al primer lunes se consideran en la semana 0.00, 01, …, 53
%cRepresentación apropiada de fecha y hora localMon Sep 30 07:06:05 2013
%xRepresentación apropiada de fecha local09/30/13
%XRepresentación apropiada de hora local07:06:05
%%El carácter ‘%’ literal%

¿Quieres ser expert@ en Python? Recibe trucos Python y las últimas novedades del blog

¡Eyyy! Esto también te puede interesar 👇

* Te informo de que los datos de carácter personal que proporciones al comentar serán tratados por Juan José Lozano Gómez como responsable de esta web. La Finalidad es moderar los comentarios. La Legitimación es gracias a tu consentimiento. Destinatarios: tus datos se encuentran alojados en Disqus (disqus.com), mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy. Podrás ejercer Tus Derechos de Acceso, Rectificación, Limitación o Suprimir tus datos enviando un email a juanjo@j2logo.com. Encontrarás más información en la POLÍTICA DE PRIVACIDAD.

Sobre j2logo

j2logo profile

Quiero ayudarte a que seas mejor programador/a, pero no uno cualquiera, sino uno de los top.

¿Quieres ser expert@ en Python? 🐍

❤️ He ayudado a miles de programadores/as como tú a ser mejores Pythonistas

📩 Recibe de vez en cuando trucos y scripts Python y las últimas novedades del blog

* Al enviar el formulario confirmas que aceptas la POLITICA DE PRIVACIDAD

¿Quieres ser expert@ en PYTHON?

j2logo-pythonistas

❤️ He ayudado a miles de programadores/as como tú

📩 Recibe trucos, scripts y las novedades del blog

¿Quieres dominar Python?

Python, Guía para ser un Pythonista

El curso con el que aprender el lenguaje desde cero. Con mi soporte y ayuda.

OFERTA BLACK FRIDAY

35% de descuento