¿Cómo convierto texto en fechas en pandas y DuckDB?
Dile a pandas y a DuckDB cómo leer tus fechas, y decide qué hacer con las que no se pueden leer.
Curso gratis. Tu Maestro, una IA, .
El formato es una instrucción
Ya sabes que ventas_exportadas tiene el día primero. Ahora díselo al programa. Un formato describe el texto pieza por pieza con códigos que empiezan con %:
| Código | Qué lee | Ejemplo |
|---|---|---|
%d | día del mes, con dos dígitos | 05 |
%m | mes, con dos dígitos | 02 |
%Y | año, con cuatro dígitos | 2026 |
%H | hora de 00 a 23 | 20 |
%M | minuto | 44 |
%S | segundo | 40 |
Lo que no es código se copia tal cual. 05/02/2026 se describe como %d/%m/%Y: día, una diagonal, mes, una diagonal, año. pandas y DuckDB usan los mismos códigos para estas piezas.
pd.to_datetime recibe el formato en format:
data["fecha"] = pd.to_datetime(data["fecha"], format="%d/%m/%Y")La columna pasa de str a datetime64.
strptime recibe el texto y el formato, y devuelve un TIMESTAMP. Como aquí no hay hora, conviértelo en DATE con ::DATE:
SELECT strptime(fecha, '%d/%m/%Y')::DATE AS fechaFROM ventas_exportadas;Limpiar la columna fecha de ventas_exportadas
Ejemplo resuelto · 5 pasos
Convierte la columna fecha de texto a fecha y comprueba que la conversión quedó bien.
Piensa el siguiente paso por tu cuenta y luego ábrelo para comparar.
Lo que no cabe en el formato
Un archivo real casi siempre trae algún valor que no cabe: un día que no existe, una fecha escrita de otra forma, una celda vacía. Con pd.to_datetime y un formato explícito, un valor no vacío incompatible detiene la conversión con ValueError. Las ausencias ("", None) se vuelven NaT incluso sin coerce. A veces quieres eso. Otras veces prefieres convertir lo que se pueda y revisar el resto aparte. Predice qué hace errors="coerce".
Cinco textos y un formato explícito. Escribe qué crees que imprime y por qué.
Cinco valores, uno de cada tipo
import pandas as pdfechas = pd.Series(["28/02/2026", "31/02/2026", "1/3/2026", "2026-03-05", ""])print(pd.to_datetime(fechas, format="%d/%m/%Y", errors="coerce"))Adivinar está bien. Lo que escribas se queda en este navegador y te espera en tu curso.
NaT significa que no hay fecha: puede ser una ausencia de origen o un valor que no se pudo convertir. Conserva la columna original, cuenta las ausencias originales y los fallos nuevos por separado y míralos antes de seguir; una Término del glosario de esas filas te dice si es una celda vacía o un formato distinto que hay que convertir aparte. Si no sabes qué hacer con tus filas sin fecha, pregúntale a tu Maestro.
DuckDB tiene las dos opciones con dos funciones: strptime se detiene con un error en el primer valor que no cabe (con 31/02/2026 dice Date out of range), y try_strptime devuelve NULL en su lugar. Un NULL de origen sigue siendo NULL. Si usas read_csv(parse_dates=...), comprueba el tipo después: un valor incompatible puede dejar toda la columna como texto sin lanzar ese error; no es el mismo comportamiento que to_datetime.
Cuidado: dayfirst no es un formato
pandas también acepta dayfirst=True. La documentación de pandas advierte que no es estricto: prefiere leer el día primero, pero no lo garantiza. Con un formato explícito no hay preferencia, hay una instrucción.
Inténtalo
Ahora con menos ayuda. La consulta suma las ventas por día, pero agrupa y ordena la columna de texto. Cámbiala para que convierta fecha con su formato, la llame dia y ordene por fecha real.
Una buena respuesta tiene 22 filas, una por cada día con ventas, de 2026-01-02 a 2026-03-28 en orden. Si ya convertiste la fecha y los días siguen en desorden, cuéntale a tu Maestro qué pusiste en GROUP BY y ORDER BY.
Tu turno
Suma el total de ventas por día, con la fecha convertida (llámala dia) y ordenada cronológicamente.
Tablas: ventas_exportadas (folio, fecha, sucursal, total)
ventas_exportadas · 29 filas
| Columna | Tipo |
|---|---|
| folio Número de ticket del punto de venta. | BIGINT |
| fecha La fecha tal como la exporta el punto de venta: texto en formato día/mes/año (dd/mm/aaaa). | VARCHAR |
| sucursal Roma, Coyoacán o Del Valle. | VARCHAR |
| total Total del ticket en pesos. | BIGINT |
Primeras filas
| folio | fecha | sucursal | total |
|---|---|---|---|
| 1001 | 02/01/2026 | Roma | 460 |
| 1002 | 05/01/2026 | Roma | 120 |
| 1003 | 05/01/2026 | Del Valle | 120 |
Tab agrega sangría; Esc y Tab para salir
Inténtalo sin ayuda
Ahora en pandas y desde cero: convierte la columna fecha de ventas_exportadas, imprime la fecha mínima y la máxima, y cuántas filas quedaron sin fecha. Una buena respuesta imprime el 2 de enero y el 28 de marzo de 2026, y 0 filas sin fecha.
Después prueba una columna pequeña con 28/02/2026, una cadena vacía y 31/02/2026. Conserva el original, identifica las ausencias antes de convertir, usa coerce y cuenta solo los nuevos fallos. Debes distinguir una ausencia original de un valor incompatible y mostrar 31/02/2026 como el texto que falló.
Tu turno
Convierte la columna fecha con su formato explícito. Imprime la fecha mínima, la máxima y cuántas filas quedaron sin fecha. Después, con la muestra de tres valores del enunciado, imprime por separado las ausencias originales y los fallos de conversión, y muestra el original que falló.
Datos: ventas-exportadas, 29 filas
| Fila | Quitar | ||||
|---|---|---|---|---|---|
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 | |||||
| 5 | |||||
| 6 | |||||
| 7 | |||||
| 8 | |||||
| 9 | |||||
| 10 | |||||
| 11 | |||||
| 12 | |||||
| 13 | |||||
| 14 | |||||
| 15 | |||||
| 16 | |||||
| 17 | |||||
| 18 | |||||
| 19 | |||||
| 20 |
Enter guarda; Esc deshace; vacía es un valor faltante
Tab agrega sangría; Esc y Tab para salir
Piensa en un archivo con fechas que uses en tu trabajo. ¿En qué formato vienen, y cómo lo comprobarías con los datos antes de convertirlas?
Reflexiona: Piensa en un archivo con fechas que uses en tu trabajo. ¿En qué formato vienen, y cómo lo comprobarías con los datos antes de convertirlas?
Solo tú y tu Maestro leen esto. Se queda en tu cuenta y se borra con ella.