Skip to content
Empieza gratis

¿En qué semana cae el 1 de enero? Semanas ISO en pandas y DuckDB

Etiqueta semanas que cruzan de año sin partirlas en dos: con la semana ISO y su año ISO, o con la fecha de su lunes.

Curso gratis. Tu Maestro, una IA, .

El reporte semanal

Café Altura revisa sus ventas cada lunes. Con meses no hay discusión sobre dónde empieza cada uno, pero con semanas sí: ¿la semana empieza en domingo o en lunes? ¿Cuál es la semana 1 del año? El 1 de enero de 2026 fue jueves. ¿Es la semana 1 de 2026, o la última de 2025?

Predice con Python antes de leer la regla.

Dos programas sobre la semana de Fin de Año 2025. Escribe qué crees que imprime cada uno y por qué.

Dos programas sobre la semana de Fin de Año 2025. Escribe qué crees que imprime cada uno y por qué.

isocalendar de cuatro fechas

Ejemplo 1 de 2

semanas.py
from datetime import date

for d in [date(2025, 12, 29), date(2026, 1, 1), date(2026, 1, 4), date(2026, 1, 5)]:
    print(d, d.isocalendar())

Adivinar está bien: se guarda tal como la escribiste para compararla. Solo tú y tu Maestro ven tus predicciones.

Ejemplo 2 de 2, se abre cuando expliques este

Haz tu predicción

La regla ISO

La norma ISO 8601 define las semanas así: empiezan en lunes, y la semana 1 de un año es la que contiene su primer jueves. Dicho de otra forma, la que contiene el 4 de enero. La documentación de Python en español lo dice con estas palabras: "La primera semana de un año ISO es la primera semana calendario (gregoriana) de un año que contiene un jueves".

De ahí salen dos cosas que sorprenden:

  • Unos días de diciembre pueden ser de la semana 1 del año siguiente, y unos días de enero pueden ser de la semana 52 o 53 del año anterior. El 1 de enero de 2027 es de la semana 53 de 2026.
  • Por eso la semana ISO tiene su propio año, el año ISO. Una etiqueta de semana necesita el año ISO, no el del calendario. La documentación de DuckDB lo advierte: %V no es compatible con %Y; usa %G.

En ventas_diarias el error tiene consecuencias. Etiquetar con %Y-W%V parte la semana del 29 de diciembre en dos grupos: 2025-W01 con tres días de diciembre (110,910 pesos) y 2026-W01 con los días de enero (128,150 pesos). Esa semana vendió 239,060 pesos. Si no ves por qué se parte en dos, pregúntale a tu Maestro.

  1. Empieza la semana en lunes

    Es la regla ISO y la que usan date_trunc('week', ...) en DuckDB e isocalendar() en Python. Si tu empresa cuenta de domingo a sábado, escríbelo en el reporte.

  2. Ponle el año ISO

    Una semana se nombra con el año ISO y la semana ISO: %G-W%V en un formato, isoyear y week en DuckDB, year y week de isocalendar() en pandas.

  3. O nómbrala por su lunes

    La etiqueta más difícil de malinterpretar es la fecha del lunes con que empieza la semana: 2025-12-29. Se ordena bien y cualquiera la entiende.

Python
iso = data["fecha"].dt.isocalendar()   # columnas year, week, day
data["semana"] = data["fecha"].dt.to_period("W").dt.start_time

to_period("W") usa semanas de lunes a domingo; start_time da el lunes. Para el 4 de enero de 2026 da el 2025-12-29.

SQL
SELECT
  date_trunc('week', fecha)::DATE AS semana,
  strftime(fecha, '%G-W%V') AS semana_iso
FROM ventas_diarias;

date_trunc('week', ...) lleva cada fecha a su lunes. isoyear(fecha) y week(fecha) dan el año y la semana ISO como números.

Inténtalo

La consulta suma las ventas de tres semanas alrededor de Año Nuevo con la etiqueta %Y-W%V, y una de las semanas sale partida en dos. Cámbiala para que cada semana sea un solo grupo: una columna semana con la fecha de su lunes y una columna semana_iso con %G-W%V. Una buena respuesta tiene tres filas, y la del 2025-12-29 suma 239,060. Si en tu trabajo la semana va de domingo a sábado, platica con tu Maestro cómo etiquetarla sin que se confunda con la semana ISO.

Suma las ventas por semana del 22 de diciembre de 2025 al 11 de enero de 2026, con semana como la fecha del lunes y semanaiso con el año ISO.

Tu turno

Suma las ventas por semana del 22 de diciembre de 2025 al 11 de enero de 2026, con semana como la fecha del lunes y semana_iso con el año ISO.

Tablas: ventas_diarias (fecha, sucursal, ventas)

ventas_diarias · 1,598 filas

ColumnaTipo
fecha El día de la venta.DATE
sucursal Roma, Coyoacán o Del Valle.VARCHAR
ventas Ventas del día en pesos.BIGINT

Primeras filas

fechasucursalventas
2025-01-02Roma12120
2025-01-02Coyoacán10650
2025-01-02Del Valle8880

Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras.

Listo para ejecutar tu consulta.

Ejecútalo tú

Inténtalo sin ayuda

Ahora en Python, sin datos: imprime la etiqueta de semana ISO (2026-W53, por ejemplo) del 28 de diciembre de 2026, del 1 de enero de 2027 y del 4 de enero de 2027. Antes de correrlo, piensa cuáles comparten semana. Una buena respuesta da la misma semana para las dos primeras fechas y otra para la tercera.

Imprime la semana ISO, con su año ISO, del 28 de diciembre de 2026, del 1 de enero de 2027 y del 4 de enero de 2027.

Imprime la semana ISO, con su año ISO, del 28 de diciembre de 2026, del 1 de enero de 2027 y del 4 de enero de 2027.

Ejecuta tu código para ver lo que imprime y el valor de su última expresión. Cada ejecución empieza de nuevo.

Listo para ejecutar tu código.

Ejecuta tu código para ver su salida aquí.

Ejecútalo tú

Comprueba lo que sabes: ¿A qué semana ISO pertenece el lunes 29 de diciembre de 2025?

Comprueba lo que sabes: Un reporte etiqueta las semanas con strftime(fecha, '%Y-W%V'). ¿Qué etiqueta recibe el martes 30 de diciembre de 2025?