Un ranking de horas de demora solo sirve si los eventos representan tiempo comparable. Los mensajes duplicados, eventos abiertos y estados superpuestos pueden producir un Pareto convincente que cuenta dos veces el mismo minuto.
Esta nota describe un método analítico, no una implementación de un empleador. Todos los identificadores y valores siguientes son sintéticos. No se utilizan nombres de bases operacionales, consultas propietarias ni valores reales de producción.
Define la pregunta y el reloj
Parte de una decisión: ¿qué categorías de demora deben investigarse para un grupo de equipos y un periodo definidos? Separa esa pregunta de utilización, disponibilidad y productividad. Esos indicadores requieren sus propias definiciones y denominadores aprobados.
Utiliza intervalos semiabiertos: el inicio pertenece al evento y el final pertenece al intervalo siguiente. Define la zona horaria del reporte y cómo se asigna un turno que cruza medianoche. Conserva las marcas de tiempo con su zona de origen y normaliza los instantes antes de compararlos. La hora de llegada permite revisar frescura; no sustituye la hora del evento.
Registra el corte de extracción. Un evento abierto no debe recibir silenciosamente la hora actual en cada ejecución. Puedes cerrarlo provisionalmente en ese corte registrado, con una bandera explícita, o excluirlo y reportar la duración sin cobertura.
Concilia los eventos antes de calcular horas
Conserva una extracción original inmutable y construye una tabla preparada aparte. Mantén el identificador original, revisión de origen, mapeo del equipo, categoría original y versión de reglas. Una categoría corregida debe seguir siendo trazable al evento recibido.
Revisa al menos estos casos:
- Identificadores duplicados y revisiones tardías: resuélvelos mediante una regla de versiones documentada, sin eliminar filas arbitrariamente.
- Final anterior al inicio: separa el evento para revisión; aplicar valor absoluto ocultaría el defecto.
- Intervalos superpuestos de un equipo: investiga el modelo de estados antes de sumar duraciones.
- Categorías ausentes: conserva un grupo explícito sin mapear en vez de descartar sus horas.
- Falta de cobertura: reporta los vacíos; la ausencia de eventos no demuestra tiempo productivo.
Los solapamientos pueden ser legítimos cuando coexisten dimensiones de estado distintas. Una bandera de mantenimiento y un estado operativo no deben convertirse en una sola duración aditiva sin una regla de precedencia aprobada por el responsable operacional.
Recorta los eventos a la ventana del reporte
Este ejemplo autónomo de PostgreSQL demuestra el recorte de un intervalo ya conciliado. No resuelve solapamientos ni establece un esquema de producción.
WITH events(asset_id, start_at, end_at) AS (
VALUES ('example-hauler',
TIMESTAMPTZ '2026-10-01 05:50:00+00',
TIMESTAMPTZ '2026-10-01 06:20:00+00')
), reporting_window AS (
SELECT TIMESTAMPTZ '2026-10-01 06:00:00+00' AS lo,
TIMESTAMPTZ '2026-10-01 07:00:00+00' AS hi
)
SELECT asset_id,
EXTRACT(EPOCH FROM (
LEAST(end_at, hi) - GREATEST(start_at, lo)
)) / 60 AS minutes_in_window
FROM events CROSS JOIN reporting_window
WHERE end_at > start_at
AND start_at < hi AND end_at > lo;El resultado ilustrativo es de 20 minutos. Usa desplazamientos horarios explícitos en lugar de depender de la zona de la sesión. PostgreSQL documenta la resta de marcas de tiempo y EXTRACT en su referencia de funciones de fecha y hora.
Usa Python para investigar las excepciones
Python permite comparar distribuciones de categorías, graficar líneas de tiempo e inspeccionar valores atípicos después de la preparación en SQL. Conserva las entradas inválidas en un dataset diagnóstico separado. Una comprobación pequeña e ilustrativa:
import pandas as pd
raw = pd.Series(["2026-10-01T06:00:00Z", "invalid"])
parsed = pd.to_datetime(raw, utc=True, errors="coerce")
invalid = raw.notna() & parsed.isna()
print({"invalid_timestamp_count": int(invalid.sum())})Aquí errors="coerce" hace visibles las marcas inválidas como NaT; no las vuelve aceptables. La prueba sintética reporta una marca inválida. Conserva las cadenas rechazadas y reporta su conteo junto con la cobertura aceptada. Consulta la referencia de conversión de pandas.
Publica una comparación defendible
Entrega las horas por categoría junto con cobertura por equipo, intervalos excluidos, horas sin mapear, corte de extracción y versión de transformación. Compara equipos equivalentes y exposición equivalente: una unidad con más horas observadas puede acumular más demora sin tener una peor tasa.
Revisa los principales contribuyentes con operaciones antes de asignar causas. Las categorías describen estados registrados; la causa raíz exige evidencia adicional. Si no puedes defender identidad, tiempo o cobertura, mejora el dataset antes de interpretar el gráfico.
Para el límite de integración, consulta la arquitectura de datos Mine-to-Mill. Para políticas reutilizables, revisa las reglas de calidad para historiadores.