Saltar al contenido principal

Cadena Python a DateTime: Cómo convertir cadenas en objetos DateTime

Aprende todo sobre el módulo datetime de Python en esta guía paso a paso, que cubre la conversión cadena-hora, ejemplos de código y errores comunes.
Actualizado 11 abr 2025  · 8 min de lectura

En Python, las cadenas son un tipo de datos común utilizado para representar fechas y horas, pero como científicos e ingenieros de datos, a menudo se nos pide que convirtamos estas cadenas en objetos fecha-hora para realizar diversas operaciones, como ordenar o comparar.

Convertir cadenas en objetos datetime puede ser complicado, especialmente para los que no conocen Python. Así que, en este artículo, te guiaré a través de los pasos necesarios para utilizar estos métodos, y te proporcionaré ejemplos de código a lo largo del camino. Tanto si eres un desarrollador experimentado como si acabas de iniciar tu andadura, ¡vamos a sumergirnos en el mundo de los objetos datetime en Python!

Para ejecutar fácilmente tú mismo todo el código de ejemplo de este tutorial, puedes crear gratuitamente un libro de trabajo DataLab que tenga Python preinstalado y contenga todos los ejemplos de código. Para practicar cómo convertir cadenas en objetos datetime, consulta este ejercicio práctico de DataCamp.

Aprende Python desde cero

Domina Python para la ciencia de datos y adquiere habilidades muy demandadas.
Empieza a aprender gratis

Introducción al módulo datetime de Python

El módulo datetime, que viene incorporado con Python, se puede utilizar siempre que necesites trabajar con fechas, horas o intervalos de tiempo para cualquier aplicación construida con Python. Proporciona clases y métodos prácticos para representar y manipular datos de fecha y hora.

Tabla 1: Resumen de clases y métodos del módulo datetime

Clase/Método Propósito Casos de uso habituales
datetime.date Representa una fecha (año, mes, día). Calcular diferencias entre fechas, formatear fechas como cadenas, extraer componentes de fechas.
datetime.time Representa una hora del día (hora, minuto, segundo, microsegundo). Comparar tiempos, formatear tiempos como cadenas, extraer componentes de tiempo.
datetime.datetime Representa una fecha y una hora. Combina las funciones de fecha y hora. Trabajar con datos de series temporales, extraer componentes de fecha y hora, formatear como cadenas.
datetime.timedelta Representa la diferencia entre dos fechas u horas (duración). Sumar/restar duraciones a/desde fechas u horas, calcular intervalos de tiempo.
datetime.strptime() Convierte una cadena en un objeto datetime según un formato especificado. Convertir cadenas en objetos fecha-hora para su posterior manipulación y análisis.
datetime.strftime() Da formato a un objeto datetime en una cadena basada en un formato especificado. Convertir objetos de fecha y hora en cadenas legibles por el ser humano para su visualización o elaboración de informes.

Comprendamos las clases principales de este módulo, ya que las convertiremos en objetos datetime:

1. datetime.date

Esta clase representa una fecha (año, mes y día) y proporciona métodos para trabajar con fechas, como calcular la diferencia entre dos fechas y formatear fechas como cadenas.

Supongamos que tenemos un conjunto de datos que contiene los precios diarios de las acciones de una empresa. Podemos utilizar la clase fecha para extraer las fechas del conjunto de datos y trazar los precios de las acciones a lo largo del tiempo.

Aquí tienes un fragmento que muestra el uso de la clase date:

from datetime import date

# create a date object representing March 1, 2023
start_date = date(2023, 3, 1)

# extract information such as the year, month, and day
year = start_date.year
month = start_date.month
day = start_date.day

# get the day of the week (Note: Monday is coded as 0, and Sunday as 6)
weekday = start_date.weekday()

# the date can be formatted as a string if needed
date_str = start_date.strftime('%Y-%m-%d')

2. datetime.time

Esta clase representa una hora del día (hora, minuto, segundo y microsegundo) y proporciona métodos para trabajar con horas, como comparar horas y formatear horas como cadenas.

Supongamos que tenemos un conjunto de datos que contiene la hora de finalización de una carrera; podemos utilizar la clase time para extraer las horas y minutos de finalización de la carrera de cada competidor.

from datetime import time

# create a time object with the microsecond granularity
end_time = time(15, 45, 30, 500000)

# get the hour and minute
hour = end_time.hour
minute = end_time.minute
second = end_time.second
microsecond = end_time.microsecond

3. datetime.datetime

Esta clase representa una fecha y una hora y proporciona métodos para trabajar con ambas. Combina la funcionalidad de las clases de fecha y hora.

Se suele utilizar en tareas de análisis de datos que implican datos de series temporales con una alta resolución temporal, como datos horarios o por minutos. Supongamos que tenemos un conjunto de datos que contiene la demanda horaria de electricidad de una ciudad. Podemos utilizar la clase datetime para extraer la fecha y la hora del conjunto de datos y trazar la demanda de electricidad a lo largo del tiempo.

from datetime import datetime

# create a datetime object representing March 1, 2023 at 9:30 AM
start_datetime = datetime(2023, 3, 1, 9, 30)

# get the year, month, day, hour, and minute
year = start_datetime.year
month = start_datetime.month
day = start_datetime.day
hour = start_datetime.hour
minute = start_datetime.minute

4. datetime.timedelta

Esta clase representa una duración o intervalo de tiempo y proporciona métodos para trabajar con intervalos de tiempo, como sumar o restar intervalos de tiempo de fechas u horas.

Supongamos que tenemos un conjunto de datos que contiene las horas de inicio y fin de un conjunto de acontecimientos, y queremos calcular la duración total de todos los acontecimientos. Podemos utilizar la clase timedelta para calcular la duración de cada evento y sumarlos.

from datetime import timedelta

# create a timedelta object representing 3 hours and 15 minutes
event_duration = timedelta(hours=3, minutes=15)

# get the total duration in seconds
event_duration_seconds = event_duration.total_seconds()

# add the duration to a start time to get an end time
event_start_time = datetime(2023, 3, 1, 18, 15)
event_end_time = event_start_time + event_duration

En todos estos casos que mostramos, utilizamos objetos de datetime, pero los datos del mundo real suelen permanecer como una cadena en la práctica. Y la conversión a un objeto datetime desbloquea todas las funcionalidades anteriores, que son potentes en el análisis y las aplicaciones de la ciencia de datos.

Convertir una cadena en un objeto datetime en Python Usando datetime.strptime()

En Python, podemos utilizar el método datetime.strptime() para convertir una cadena en un objeto datetime. El método strptime() toma dos argumentos: la cadena a convertir y una cadena de formato que especifica el formato de la cadena de entrada.

La cadena de formato utiliza una combinación de códigos de formato para representar los distintos componentes de la fecha y la hora. Aquí tienes algunos de los códigos de formato más utilizados:

Tabla 2: Códigos comunes de formato fecha-hora

Código de formato Descripción Ejemplo de entrada Ejemplo de salida
%Y Año de 4 dígitos 2023 2023
%y Año de 2 dígitos 23 23
%m Mes de 2 dígitos (01-12) 03 03
%d 2 dígitos del día del mes (01-31) 15 15
%H Hora de 2 dígitos (00-23) 14 14
%I Hora de 2 dígitos (01-12) 02 02
%M Minuto de 2 dígitos (00-59) 45 45
%S Segundo de 2 dígitos (00-59) 30 30
%f Microsegundo (000000-999999) 123456 123456
%p AM o PM PM PM
%z Desplazamiento UTC +0530 +0530
%a Nombre abreviado del día de la semana Mar Mar
%A Nombre completo del día de la semana Martes Martes
%b Nombre abreviado del mes Mar Mar
%B Nombre completo del mes Marzo Marzo
%j Día del año (001-366) 074 074
%U Número de la semana del año (domingo como primer día) 10 10
%W Número de la semana del año (lunes como primer día) 09 09

Ahora que entendemos las directivas strptime, el proceso de convertir cadenas en objetos datetime puede simplificarse.

  • Paso 01: Analiza la cadena fecha-hora que se puede convertir en busca de patrones que coincidan con los códigos de formato.
  • Paso 02: Crea el formato fecha-hora a partir de las directivas strptime().
  • Paso 03: Pasa la cadena y el formato a la función y recibe el objeto como salida.

Pongamos en práctica estos pasos.

Convertir una cadena con un formato específico en un objeto datetime

from datetime import datetime

# Example with the standard date and time format
date_str = '2023-02-28 14:30:00'
date_format = '%Y-%m-%d %H:%M:%S'

date_obj = datetime.strptime(date_str, date_format)
print(date_obj)

# Example with a different format

date_str = '02/28/2023 02:30 PM'
date_format = '%m/%d/%Y %I:%M %p'

date_obj = datetime.strptime(date_str, date_format)
print(date_obj)

En el primer ejemplo, tenemos una cadena que representa una fecha y una hora en el formato 'AAAA-MM-DD HH:MM:SS', y en el segundo ejemplo en un formato diferente, 'MM/DD/AAAA HH:MM AM/PM'.

En ambos casos, después de especificar la cadena de formato correcta como segundo argumento a strptime() para recibir el objeto datetime correcto.

Convertir una cadena con información sobre la zona horaria en un objeto datetime

from datetime import datetime

date_str = '2023-02-28 14:30:00+05:30'
date_format = '%Y-%m-%d %H:%M:%S%z'

date_obj = datetime.strptime(date_str, date_format)
print(date_obj)

En este ejemplo, tenemos una cadena que representa una fecha y una hora con información sobre la zona horaria en el formato "AAAA-MM-DD HH:MM:SS+TZOFFSET", donde TZOFFSET es el desfase horario en horas y minutos respecto a UTC. Especificamos la cadena de formato como segundo argumento de strptime(), incluyendo el código de formato %z para analizar el desfase horario.

Aunque la función que hemos visto antes puede parecer fácil en teoría, también puede ser una fuente de frustración cuando las cosas van mal en la práctica.

Análisis sintáctico de fechas sin cadenas de formato con dateutil

Otra opción flexible es la biblioteca dateutil, en particular la función parser.parse(). Detecta automáticamente los formatos de fecha, lo que te permite analizar cadenas sin especificar una cadena de formato.

from dateutil.parser import parse

# Automatically infers the format
date_obj = parse("March 1, 2023 9:30 AM")
print(date_obj)

Esto es especialmente útil cuando se trata de formatos de fecha impredecibles o incoherentes.

Manejo de las zonas horarias

Para manejar la fecha y hora según la zona horaria, Python ofrece dos opciones muy populares:

  • pytz (ampliamente utilizado y compatible con versiones anteriores)

  • zoneinfo (introducido en Python 3.9, forma parte de la biblioteca estándar)

from datetime import datetime
from zoneinfo import ZoneInfo

# Using zoneinfo
dt = datetime(2023, 3, 1, 9, 30, tzinfo=ZoneInfo("America/New_York"))
print(dt)

# Using pytz (alternative)
import pytz
dt_pytz = datetime(2023, 3, 1, 9, 30, tzinfo=pytz.timezone("America/New_York"))
print(dt_pytz)

Estas herramientas te permiten asignar zonas horarias, convertir entre ellas y tener en cuenta el horario de verano automáticamente.

Consideraciones sobre el horario de verano

El horario de verano (DST, por sus siglas en inglés) puede causar complicaciones, sobre todo cuando los relojes se adelantan o atrasan.

Bibliotecas como zoneinfo y pytz gestionan las transiciones DST automáticamente cuando asignas la zona horaria adecuada:

from datetime import datetime
from zoneinfo import ZoneInfo

# Before and after DST starts
before_dst = datetime(2023, 3, 12, 1, 30, tzinfo=ZoneInfo("America/New_York"))
after_dst = datetime(2023, 3, 12, 3, 30, tzinfo=ZoneInfo("America/New_York"))

print(before_dst)
print(after_dst)

Esto garantiza que los cálculos de fecha y hora sigan siendo precisos aunque cambie el horario de verano.

Uso de pandas para la conversión de fecha y hora

Aunque el módulo datetime incorporado en Python es potente, muchos científicos de datos prefieren utilizar la biblioteca pandas para las conversiones fecha-hora debido a su simplicidad y capacidad para manejar columnas enteras de fechas de forma eficiente.

import pandas as pd

# Converting a column of strings to datetime objects
date_series = pd.to_datetime(['2023-02-28', '2023-03-01', '2023-03-02'])
print(date_series)

Pandas infiere automáticamente los formatos y maneja con elegancia las incoherencias más comunes, lo que lo convierte en la mejor opción cuando se trabaja con datos tabulares.

Formatear objetos datetime a cadenas con strftime()

Una vez que hayas convertido cadenas en objetos fecha-hora y hayas realizado las operaciones deseadas, puede que necesites volver a convertirlos en cadenas. Para ello, puedes utilizar datetime.strftime().

from datetime import datetime

now = datetime.now()
formatted = now.strftime('%Y-%m-%d %H:%M:%S')
print(formatted)

Este método te da un control total sobre cómo se muestra tu objeto fecha-hora en forma de cadena.

Solución de errores comunes de strptime()

Aquí tienes algunos errores comunes que puedes encontrarte y cómo solucionarlos:

ValueError: el dato horario 'cadena_fecha' no coincide con el formato '%Y-%m-%d %H:%M:%S'

El error más común se produce cuando la cadena de entrada no coincide con la cadena de formato. Comprueba que la cadena de entrada y la cadena de formato coinciden exactamente.

import datetime

# When input has two-digit year instead of four-digit year
date_str = '23-03-01'
date_obj = datetime.datetime.strptime(date_str, '%y-%m-%d')
# Raises ValueError: time data '23-03-01' does not match format '%y-%m-%d'

# When the input has missing leading zeros for hour and minute
time_str = '8:30'
time_obj = datetime.datetime.strptime(time_str, '%H:%M')
# Raises ValueError: time data '8:30' does not match format '%H:%M'

TypeError: strptime() argumento 1 debe ser str, no 'int'

El siguiente error habitual se produce cuando pasas un número entero a datetime.strptime() o time.strptime() en lugar de una cadena. Asegúrate de que todos los valores que pasas a la función son cadenas.

# Example 1: Integer instead of string
date_int = 20230301
date_obj = datetime.datetime.strptime(date_int, '%Y%m%d')
# Raises TypeError: strptime() argument 1 must be str, not int

# Example 2: List instead of string
date_list = [2023, 3, 1]
date_obj = datetime.datetime.strptime(date_list, '%Y-%m-%d')
# Raises TypeError: strptime() argument 1 must be str, not list

ValueError: quedan datos sin convertir: ':00'

Este error se produce cuando existen caracteres sobrantes en la cadena de entrada, que no coincide con la cadena de formato. Por ejemplo, este error se producirá si la cadena de formato sólo especifica el año, el mes y el día, pero la cadena de entrada también contiene la hora del día. Para depurar este error, asegúrate de que la cadena de formato coincide con toda la cadena de entrada.

# when input string contains time of day
date_str = '2023-03-01 12:30:00'
date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
# Raises ValueError: unconverted data remains:  12:30:00

# When input string contains extra characters
date_str = '2023-03-01T00:00:00Z'
date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
# Raises ValueError: unconverted data remains: T00:00:00Z

Conclusión

Es seguro decir que el método datetime.strptime() proporciona una forma flexible y potente de convertir cadenas en objetos datetime en Python y puede utilizarse para manejar una amplia gama de formatos de fecha y hora. ¿Por qué no coges nuestra Ficha de Fechas y Horas para consultarla más tarde?

Tras comprender las fechas y horas, el siguiente paso es practicarlas en un proyecto. Te recomendamos que elijas uno de ellos y solidifiques tu aprendizaje:

Estamos de acuerdo en que los datos de fecha y hora en el mundo real son complicados, pero todo lo que necesitas es comprender los formatos y patrones que hay detrás de cada tipo de fecha y hora que tienes en tus datos y utilizar sabiamente las bibliotecas de que dispones.

Preguntas frecuentes

¿Cómo puedo manejar cadenas con formatos de fecha mezclados en el mismo conjunto de datos?

Cuando trabajes con conjuntos de datos que incluyan formatos de fecha mixtos, puedes utilizar el módulo dateutil de Python. La función dateutil.parser.parse() es más flexible que datetime.strptime(), ya que puede detectar y analizar automáticamente diversos formatos de fecha sin necesidad de una cadena de formato predefinida:

from dateutil.parser import parse

date_str1 = '2023-03-01'
date_str2 = 'March 1, 2023'

date_obj1 = parse(date_str1)
date_obj2 = parse(date_str2)

print(date_obj1)  # Output: 2023-03-01 00:00:00
print(date_obj2)  # Output: 2023-03-01 00:00:00

¿Puedo convertir cadenas en objetos fecha-hora teniendo en cuenta las distintas zonas horarias?

Sí, puedes manejar las zonas horarias utilizando la biblioteca pytz en combinación con datetime. Primero, convierte la cadena en un objeto datetime, y luego adjunta una zona horaria utilizando pytz.timezone():

from datetime import datetime
import pytz

date_str = '2023-03-01 14:30:00'
date_format = '%Y-%m-%d %H:%M:%S'
date_obj = datetime.strptime(date_str, date_format)

# Set time zone
timezone = pytz.timezone('US/Eastern')
date_obj_tz = timezone.localize(date_obj)

print(date_obj_tz)  # Output: 2023-03-01 14:30:00-05:00

¿Cuál es la diferencia entre datetime.strptime() y datetime.fromisoformat()?

datetime.strptime() te permite especificar una cadena de formato personalizada para analizar formatos de fecha no estándar o variados.

datetime.fromisoformat() está diseñada específicamente para analizar cadenas de fecha con formato ISO 8601 (por ejemplo, '2023-03-01T14:30:00'). Es más sencillo de utilizar si tus cadenas siguen estrictamente la norma ISO 8601:

from datetime import datetime

iso_date_str = '2023-03-01T14:30:00'
date_obj = datetime.fromisoformat(iso_date_str)
print(date_obj)  # Output: 2023-03-01 14:30:00

Arunn Thevapalan's photo
Author
Arunn Thevapalan
LinkedIn
Twitter

Como científico de datos senior, diseño, desarrollo e implanto soluciones de aprendizaje automático a gran escala para ayudar a las empresas a tomar mejores decisiones basadas en datos. Como escritora de ciencia de datos, comparto aprendizajes, consejos profesionales y tutoriales prácticos en profundidad.

Temas

Más información sobre Python

Curso

Time Series Analysis in Python

4 hr
63.7K
In this four-hour course, you’ll learn the basics of analyzing time series data in Python.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

Cómo aprender Python desde cero en 2024: Guía del experto

Descubre cómo aprender Python, sus aplicaciones y la demanda de conocimientos de Python. Comienza hoy tu andadura en Python ​con nuestra guía completa.
Matt Crabtree's photo

Matt Crabtree

15 min

Tutorial

Tutorial de cadenas en Python

En este tutorial, aprenderás todo sobre las cadenas de Python: trocearlas y encadenarlas, manipularlas y darles formato con la clase Formatter, cadenas f, plantillas y ¡mucho más!
Sejal Jaiswal's photo

Sejal Jaiswal

10 min

Tutorial

Tutorial de Python String format()

Aprende a formatear cadenas en Python.
DataCamp Team's photo

DataCamp Team

5 min

Tutorial

Tutorial de Comparación de cadenas difusas en Python

En este tutorial, aprenderás a hacer coincidir aproximadamente cadenas y a determinar su similitud repasando varios ejemplos.
Kurtis Pykes 's photo

Kurtis Pykes

11 min

Tutorial

Conversión de tipos de datos en Python: Una guía con ejemplos

En este tutorial de Python, abordarás la conversión implícita y explícita de tipos de datos de estructuras de datos primitivas y no primitivas con la ayuda de ejemplos de código.
Sejal Jaiswal's photo

Sejal Jaiswal

14 min

Tutorial

Datos JSON en Python

Trabajar con JSON en Python: Una guía paso a paso para principiantes
Moez Ali's photo

Moez Ali

6 min

Ver másVer más