¿Cómo agrupo ventas por mes y por trimestre?
Agrupa ventas por mes y por trimestre sin juntar enero de un año con enero del siguiente: trunca cada fecha al inicio de su periodo en pandas y en DuckDB.
Curso gratis. Tu Maestro, una IA, .
Las ventas de cada día
Para este módulo, Café Altura te pasa ventas_diarias: lo que vendió cada sucursal cada día, de enero de 2025 a junio de 2026. Son 1,598 filas sintéticas, y cada fila es una sucursal en un día: esa es la Término del glosario de la tabla. La columna fecha ya es una fecha.
Casi ningún reporte se lee por día. La dirección quiere meses y trimestres. Para eso le pones a cada fecha la etiqueta de su periodo y sumas por etiqueta. La pregunta es qué etiqueta. Predice.
Cuatro ventas en dos años y dos maneras de agruparlas por mes. Escribe qué crees que imprime cada programa y por qué.
Cuatro ventas en dos años y dos maneras de agruparlas por mes. Escribe qué crees que imprime cada programa y por qué.
Agrupar por dt.month
Ejemplo 1 de 2
import pandas as pd
ventas = pd.DataFrame({
"fecha": pd.to_datetime(["2025-01-15", "2025-02-10", "2026-01-20", "2026-02-05"]),
"ventas": [100, 200, 300, 400],
})
print(ventas.groupby(ventas["fecha"].dt.month)["ventas"].sum())
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
El mes es el mes de un año
El primer programa comete un error que no se nota con datos de un solo año y aparece en cuanto la tabla cruza diciembre. En ventas_diarias, agrupar por número de mes junta enero de 2025 con enero de 2026, y así hasta junio. Agrupar por trimestre con quarter(fecha) hace lo mismo: el primer trimestre de 2025 y el de 2026 suman 6,529,310 pesos en un solo grupo.
La etiqueta que funciona es el periodo completo. En pandas, to_period lo hace. En SQL se usa truncar: cortar la fecha al primer día de su periodo. El 17 de marzo de 2026 truncado al mes es el 2026-03-01; el 17 de mayo truncado al trimestre es el 2026-04-01, el primer día del segundo trimestre. Todas las fechas de un mismo periodo quedan con la misma etiqueta, y la etiqueta sigue siendo una fecha que se ordena bien. Pídele a tu Maestro que trunque contigo una fecha, al mes y al trimestre, paso por paso.
data["mes"] = data["fecha"].dt.to_period("M")
data["trimestre"] = data["fecha"].dt.to_period("Q")
por_mes = data.groupby("mes")["ventas"].sum()Un trimestre se imprime como 2025Q1. Si necesitas una fecha en vez de un periodo, .dt.to_timestamp() da el primer día.
SELECT
date_trunc('month', fecha)::DATE AS mes,
sum(ventas) AS ventas
FROM ventas_diarias
GROUP BY mes
ORDER BY mes;date_trunc siempre devuelve un TIMESTAMP; ::DATE le quita la hora 00:00:00. Para trimestres, date_trunc('quarter', fecha).
Inténtalo
La consulta suma las ventas por trimestre con quarter(fecha), que es solo el número del trimestre. Cámbiala para que cada trimestre de cada año sea su propio grupo, con una columna trimestre que sea la fecha del primer día. Una buena respuesta tiene seis filas, de 2025-01-01 a 2026-04-01.
Suma las ventas por trimestre del calendario, con trimestre como la fecha del primer día de cada trimestre.
Tu turno
Suma las ventas por trimestre del calendario, con trimestre como la fecha del primer día de cada trimestre.
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 pandas y desde cero: suma las ventas de toda la cadena por mes e imprime cuál fue el mes con más ventas y cuánto vendió. Una buena respuesta da diciembre de 2025. Si te sale enero o un número del 1 al 12, pégale tu código a tu Maestro.
Suma las ventas de toda la cadena por mes del calendario e imprime el mes con más ventas y su total.
Suma las ventas de toda la cadena por mes del calendario e imprime el mes con más ventas y su total.
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í.
Datos: ventas-diarias, 1,598 filas
Enter guarda una celda y Escape la deja como estaba. Deja una celda vacía para un valor faltante.
| Fila | Quitar | |||
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 | ||||
| 9 | ||||
| 10 | ||||
| 11 | ||||
| 12 | ||||
| 13 | ||||
| 14 | ||||
| 15 | ||||
| 16 | ||||
| 17 | ||||
| 18 | ||||
| 19 | ||||
| 20 |