Original article: Python String to Datetime – How to Convert an Str to a Date Time with Strptime

Python ofrece una variedad de módulos integrados que puedes incluir en tu programa.

Un módulo es un archivo de Python que contiene el código necesario para ejecutar una funcionalidad individual. Este archivo se importa a su aplicación para ayudarte a realizar una tarea específica.

Uno de estos módulos es el módulo  datetime, para trabajar y manipular horas y fechas.

El módulo datetime incluye la clase datetime la cual a su vez proporciona el método de clase strptime(). El método strptime() crea un objeto datetime  a partir de una representación de la correspondiente fecha y hora.

En este artículo, aprenderás cómo usar el método datetime.strptime() para convertir cadenas a objetos datetime.

¡Vamos a ello!

¿Qué es el método datetime.strptime() en Python? Un desglose de la sintaxis de datetime.strptime()

La sintaxis del método datetime.strptime() luce más o menos como siguiente:

datetime.strptime(date_string, format_code)


Veamos más al respecto:

Primero que nada, datetime es el nombre de la clase.

A continuación, strptime() es el nombre del método. El método acepta dos argumentos de cadenas requeridos.

  • El primer argumento requerido es date_string: Es la representación en formato de cadena de la fecha que buscas convertir a un objeto datetime.
  • El segundo argumento requerido es format_code: un formato específico que te ayudará a convertir la cadena a un objeto datetime.

He aquí una breve lista de algunos de los formatos de código más comunes que te puedes encontrar:

  • %d - El día del mes con un número decimal con ceros como  28.
  • %a - El nombre abreviado de un día, por ejemplo, domingo (Sunday) se abrevia a Sun
  • %A - El nombre completo del día Sunday.
  • %m - El mes como un decimal acompañado de cero, cómo es el caso de 01.
  • %b - El nombre abreviado del mes como Jan.
  • %B - El nombre completo del mes January.
  • %y - El año sin siglos 23.
  • %Y - El año con siglos 2023.
  • %H - Las horas del día en un formato de 24 horas, al igual que 08.
  • %I - Las horas del día en un formato de 12 horas.
  • %M - Los minutos en una hora, al igual que 20.
  • %S - Los segundos en un minuto, al igual que 00.

Para ver una tabla que muestre todos los códigos de formato para  datetime.strptime(), por favor, referirte a la documentación de Python.

¿Cómo usar el método datetime.strptime() en Python? Convirtiendo una cadena en un objeto Datetime en Python

Supongamos que tengo la siguiente cadena que representa fecha y una hora en específico:

28/01/23  08:20:00

Y necesito obtener el siguiente resultado:

2023-01-28 08:20:00

¿Cómo lograrlo en Python?

Demos una mirada al código abajo:

# importamos la clase datetime de nuestro módulo datetime
from datetime import datetime

date_time_str = "28/01/23  08:20:00"

# Verificamos el contenido que pondremos en date_time_str
print(type(date_time_str))

# Resultado

# <class 'str'>

Primero importamos el módulo datetime con la declaración: from datetime import datetime.

No confundirse en esta repetición, puesto que aquí indicamos que deseamos importar la función datetime del módulo datetime.

Posteriormente, almacenamos la cadena que queremos convertir a objeto datetime. Esto lo hacemos al definir una variable llamada date_time_str. Y por razones de verificación, comprobamos su tipo mediante la función type(). El resultado nos indica que es una cadena.

Cómo ahora ya sabemos que, en efecto, es una cadena, podemos pasar a convertir esta cadena a un objeto datetime usando el método strptime(). Recuerda que este sigue siendo un método de la misma clase datetime por lo que no es necesario hacer nada más.

Finalmente, verificamos el contenido, y nos aseguramos de que la conversión haya sido exitosa:

from datetime import datetime

date_time_str = "28/01/23  08:20:00"

#En esta parte aplicamos la sintaxis aprendida al principio 

date_time_object = datetime.strptime(date_time_str, "%d/%m/%y %H:%M:%S")

print(date_time_object)

# Comprobamos la clase del objeto mediante type: date_time_object_type
print(type(date_time_object))

# Resultado

# 2023-01-28 08:20:00
# <class 'datetime.datetime'>

Los formatos de código de la cadena son 28/01/23 08:20:00 y %d/%m/%y %H:%M:%S.

El formato de código %d,%m,%y,%H,%M,%S representa el día del mes, el mes y el año correspondientes. Después de la fecha le siguen, la hora del día, los minutos y segundos (siendo una cadena bastante precisa).

Ahora, cambiemos la cadena inicial un poco:

Cambiemos la fecha 28/01/23 a 28 January 2023 verificando la clase de date_time_str:

from datetime import datetime

date_time_str = "28 January 2023 08:20:00"

#check data type
print(type(date_time_str))

# resultado

# <class 'str'>

Ahora convirtamos  date_time_str a un objeto datetime: Recuerda que debido a que la cadena es diferente, también debes cambiar el formato de código:

from datetime import datetime

date_time_str = "28 January 2023 08:20:00"

date_object = datetime.strptime(date_time_str, "%d %B %Y %H:%M:%S")

print(date_object)

#Verificamos la clase
print(type(date_object))

# resultado

# 2023-01-28 08:20:00
# <class 'datetime.datetime'>

El formato de código para la cadena 28 January 2023 08:20:00 es %d %B %Y %H:%M:%S.

Debido a que cambié el mes de enero de una representación acompañada por cero  01, a su nombre completo, January, también necesito cambiar su formato de código – de %m a %B.

Cómo convertir una cadena en un objeto datetime.date() en Python

Pero... ¿Qué pasa si solo deseas convertir la fecha pero no la hora de una cadena?

Si solo deseas convertir la parte 28/01/23 de la cadena 28/01/23 08:20:00 a un objeto datetime.

Para convertir una cadena a un objeto datetime, primero usamos el método strptime() como vimos en la sección anterior. Pero además usaremos el método datetime.date() para extraer únicamente la fecha.

from datetime import datetime

date_time_str = "28 January 2023 08:20:00"

date_object = datetime.strptime(date_time_str, "%d %B %Y %H:%M:%S").date()

print(date_object)

#Verificando la clase
print(type(date_object))

# Resultado

# 2023-01-28
# <class 'datetime.date'>

Cómo convertir una cadena a un objeto datetime.time() en Python

Ahora, para cubrir la parte final, veremos como convertir solo la hora dejando intacta la fecha, es decir, lo contrario a lo anterior. Para convertir solo la fecha 08:20:00 de la cadena 28/01/23 08:20:00 usaremos el método datetime.time() para extraer únicamente la fecha:

from datetime import datetime

date_time_str = "28 January 2023 08:20:00"

date_object = datetime.strptime(date_time_str, "%d %B %Y %H:%M:%S").time()

print(date_object)
print(type(date_object))

# Resultado

# 08:20:00
# <class 'datetime.time'>

¿Por qué surge ValueError cuando usamos datetime.strptime() en Python?

Algo a tener en cuenta es que la cadena sobre la que hemos pasado un argumento con el método strptime() necesita, primero que nada, tener un formato específico.

Específicamente, el año, el mes, y el día en la cadena debe ser equivalente al formato de código.

Por ejemplo, el formato de código para el mes en la cadena 28/01/23 debe ser %m, el cual representa el mes como un decimal acompañado de ceros.

¿Qué pasa cuando uso el formato de código %B en su lugar?

from datetime import datetime

date_time_str = "28/01/23  08:20:00"

date_time_object = datetime.strptime(date_time_str, "%d/%B/%y %H:%M:%S")

print(date_time_object)

# Resultado

# raise ValueError("time data %r does not match format %r" %
# ValueError: time data '28/01/23  08:20:00' does not match format '%d/%B/%y # %H:%M:%S'

¡Obtengo ValueError!

El formato de código %B representa el nombre completo del mes, que en este caso es January y no 01. En otras palabras, estábamos escribiendo el mes como 01 en lugar de  January.

En ese caso, al pasar en la cadena el método strptime() no coincide con el formato específico y de allí que obtengamos ValueError en su lugar.

Para analizar esto, puedes pasar un test para detectar y arreglar el error usando un bloque try-except así:

from datetime import datetime

date_time_str = "28/01/23  08:20:00"

try:
  date_time_object = datetime.strptime(date_time_str, "%d/%B/%y %H:%M:%S")
except ValueError as error:
  print('A ValueError is raised because :', error)
  
# Resultado

# A ValueError is raised because : time data '28/01/23  08:20:00' does not # match format '%d/%B/%y %H:%M:%S'

Conclusión

Espero que este artículo te haya ayudado a comprender cómo convertir una cadena a un objeto datetime en Python empleando el método strptime().

Muchísimas gracias por leer y... ¡Feliz programación!