¿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
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
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:
%Vno 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.
Empieza la semana en lunes
Es la regla ISO y la que usan
date_trunc('week', ...)en DuckDB eisocalendar()en Python. Si tu empresa cuenta de domingo a sábado, escríbelo en el reporte.Ponle el año ISO
Una semana se nombra con el año ISO y la semana ISO:
%G-W%Ven un formato,isoyearyweeken DuckDB,yearyweekdeisocalendar()en pandas.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.
iso = data["fecha"].dt.isocalendar() # columnas year, week, day
data["semana"] = data["fecha"].dt.to_period("W").dt.start_timeto_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.
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
| Columna | Tipo |
|---|---|
| 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
| fecha | sucursal | ventas |
|---|---|---|
| 2025-01-02 | Roma | 12120 |
| 2025-01-02 | Coyoacán | 10650 |
| 2025-01-02 | Del Valle | 8880 |
Cada ejecución empieza con copias nuevas de las tablas del curso, así que puedes probar lo que quieras. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu consulta.
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. Ctrl+Enter ejecuta tu código. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu código.
Ejecuta tu código para ver su salida aquí.