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).
Directiva | Significado | Ejemplo |
%a | Nombre abreviado del día de la semana | Sun, Mon, … |
%A | Nombre completo del día de la semana | Sunday, Monday, … |
%w | Día de la semana como número decimal (domingo es 0) | 0, 1, …, 6 |
%d | Día del mes como número decimal (añade cero delante) | 01, 02, …, 31 |
%-d | Día del mes como número decimal | 1, 2, …, 30 |
%b | Nombre del mes abreviado | Jan, Feb, …, Dec |
%B | Nombre del mes completo. | January, February, … |
%m | Mes como número decimal (añade cero delante) | 01, 02, …, 12 |
%-m | Mes como número decimal | 1, 2, …, 12 |
%y | Año sin siglo como número decimal (añade cero delante) | 00, 01, …, 99 |
%-y | Año sin siglo como número decimal | 0, 1, …, 99 |
%Y | Año con siglo como número decimal | 2013, 2019 etc. |
%H | Hora (24 horas) como número decimal (añade cero delante) | 00, 01, …, 23 |
%-H | Hora (24 horas) como número decimal | 0, 1, …, 23 |
%I | Hora (12 horas) como número decimal (añade cero delante) | 01, 02, …, 12 |
%-I | Hora (12 horas) como número decimal | 1, 2, … 12 |
%p | AM o PM locales | AM, PM |
%M | Minuto como número decimal (añade cero delante) | 00, 01, …, 59 |
%-M | Minuto como número decimal | 0, 1, …, 59 |
%S | Segundo como número decimal (añade cero delante) | 00, 01, …, 59 |
%-S | Segundo como número decimal | 0, 1, …, 59 |
%f | Microsegundos como número decimal (añade ceros delante) | 000000 – 999999 |
%z | Compensación UTC con formato +HHMM o -HHMM | |
%Z | Nombre de la zona horaria | |
%j | Día del año como número decimal (añade cero delante) | 001, 002, …, 366 |
%-j | Día del año como número decimal | 1, 2, …, 366 |
%U | Nú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 |
%W | Nú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 |
%c | Representación apropiada de fecha y hora local | Mon Sep 30 07:06:05 2013 |
%x | Representación apropiada de fecha local | 09/30/13 |
%X | Representación apropiada de hora local | 07:06:05 |
%% | El carácter ‘%’ literal | % |