Skip to content
Empieza gratis

¿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 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

numero_de_mes.py
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

Haz tu predicción

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.

Python
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.

SQL
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

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 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.

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.

Los datos del ejercicio, "ventas-diarias". Tus cambios corren con tu código.
FilaQuitar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Página 1 de 80

Ejecútalo tú

Comprueba lo que sabes: ventas_diarias va de enero de 2025 a junio de 2026. Si agrupas con GROUP BY month(fecha), ¿cuántos grupos salen?