(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo convertir texto en fechas con pandas en Python

João Barros 11 de July de 2026 4 min de lectura

Las fechas guardadas como texto son una de las causas más habituales de errores en los análisis con pandas: ordenaciones incorrectas, filtros que no devuelven nada y gráficos sin sentido. Convertir texto en fechas con pandas en Python resuelve el problema y abre la puerta a filtros por periodo, agrupaciones por mes y cálculos de diferencia entre fechas. El camino es siempre el mismo: pd.to_datetime(), con el formato correcto.

Requisitos previos

  • Python 3.9 o superior instalado
  • pandas instalado (pip install pandas)
  • Un editor o notebook (VS Code, Jupyter, Google Colab)
  • Nociones básicas de DataFrames

Paso 1: Crear un DataFrame de ejemplo

Partimos de un caso realista: una lista de pedidos en la que la fecha viene de un CSV y, por tanto, llega como texto. Fíjese en que hay una fila con un valor no válido — es a propósito, porque es lo que ocurre con los datos reales.

import pandas as pd

dados = {
    "encomenda": [1001, 1002, 1003, 1004],
    "data": ["01/03/2026", "15/03/2026", "02/04/2026", "sem data"],
    "valor": [120.5, 80.0, 210.0, 45.0],
}

df = pd.DataFrame(dados)
print(df.dtypes)

El resultado muestra data object. En pandas, object significa texto. Mientras la columna siga así, no se puede ordenar cronológicamente ni filtrar por mes.

Paso 2: Convertir texto en fechas con pd.to_datetime

La función pd.to_datetime() hace la conversión. Como las fechas están en formato europeo (día primero), indicamos dayfirst=True.

df["data"] = pd.to_datetime(df["data"], dayfirst=True)

Si lo ejecuta tal cual, obtendrá un error parecido a ValueError: time data "sem data" doesn't match format. Es el comportamiento esperado: por defecto, pandas prefiere fallar antes que inventarse una fecha. El paso siguiente lo resuelve.

Paso 3: Gestionar los errores con errors="coerce"

Con errors="coerce", todo lo que no sea una fecha válida pasa a NaT (el "valor faltante" de las fechas) en lugar de romper el script.

df["data"] = pd.to_datetime(df["data"], dayfirst=True, errors="coerce")
print(df)

La fila 1004 queda como NaT y el resto se convierte. No se pierde nada: el problema queda a la vista, no escondido.

Paso 4: Indicar el formato exacto (más rápido y más seguro)

Cuando conoce el formato de origen, indíquelo con format. Es más rápido en ficheros grandes y evita interpretaciones ambiguas, como que 03/04 se lea como 4 de marzo en lugar de 3 de abril.

df["data"] = pd.to_datetime(
    df["data_original"],
    format="%d/%m/%Y",
    errors="coerce",
)

Los códigos más usados son %d (día), %m (mes), %Y (año con 4 dígitos) y %H:%M:%S (hora). Para un valor como 2026-03-01 14:30:00, el formato es "%Y-%m-%d %H:%M:%S".

Paso 5: Localizar las filas que han fallado

Antes de continuar, revise qué filas no ha podido convertir pandas. Muchas veces hay un patrón (un separador distinto, una cabecera repetida en medio del fichero).

problemas = df[df["data"].isna()]
print(problemas)
print("Linhas por converter:", len(problemas))

Paso 6: Extraer año, mes y día con el accesor .dt

Cuando la columna es realmente una fecha, el accesor .dt da acceso a todas las partes del calendario: aquí es donde compensa la conversión.

df["ano"] = df["data"].dt.year
df["mes"] = df["data"].dt.month
df["dia_semana"] = df["data"].dt.day_name()
df["mes_ano"] = df["data"].dt.to_period("M")

print(df[["encomenda", "data", "ano", "mes", "dia_semana"]])

Paso 7: Filtrar y agrupar por periodo

Con fechas de verdad, filtrar por intervalo y sumar por mes es trivial.

inicio = pd.Timestamp("2026-03-01")
fim = pd.Timestamp("2026-03-31")

marco = df[(df["data"] >= inicio) & (df["data"] <= fim)]
print(marco)

por_mes = df.groupby(df["data"].dt.to_period("M"))["valor"].sum()
print(por_mes)

Comprobar el resultado

Haga tres comprobaciones rápidas:

  • df.dtypes debe mostrar datetime64[ns] en la columna data (y ya no object).
  • df["data"].isna().sum() indica cuántas fechas no se han convertido: lo ideal es 0, o un número que pueda explicar.
  • df["data"].min() y df["data"].max() deben devolver fechas plausibles. Un mínimo en 1970 o un máximo en 2073 es señal de un formato mal interpretado.

Conclusión

Con pd.to_datetime(), format y errors="coerce" ya puede transformar cualquier columna de texto en una columna de fechas fiable, encontrar los registros problemáticos y agrupar por periodo. El siguiente paso natural es explorar df.resample("M") para series temporales o pd.date_range() para crear un calendario completo y detectar días sin ventas. Consejo final: si importa siempre el mismo fichero, ahorre trabajo y convierta ya en la lectura, con pd.read_csv("ficheiro.csv", parse_dates=["data"], dayfirst=True). ¿Sabe ya cuál es el formato exacto de las fechas en sus ficheros?