Proyecto abierto · Sin ánimo de lucro

¿Qué es enhora.info?

enhora.info es un tablero de seguimiento de puntualidad de los trenes Renfe en España. Recoge datos en abierto publicados por Renfe, los procesa automáticamente cada hora y los presenta de forma clara para que cualquier persona pueda ver, en tiempo real y a lo largo del tiempo, cómo funciona la red ferroviaria española.

El objetivo no es criticar ni señalar, sino documentar. Si los retrasos mejoran, aquí se verá. Si empeoran, también.

Concienciar sobre la infraestructura ferroviaria

El ferrocarril es una infraestructura esencial. Millones de personas en España dependen de él cada día para ir al trabajo, a la universidad o a visitar a su familia. Sin embargo, la información sobre su puntualidad real suele quedarse en estadísticas anuales de difícil acceso o en titulares puntuales.

enhora.info nace para llenar ese hueco: ofrecer una visión continua y verificable de cómo funciona la red, con datos públicos y metodología transparente. Así, ciudadanos, periodistas, investigadores o simplemente viajeros habituales pueden consultar la situación actual y la evolución histórica de los retrasos.

Este proyecto no tiene ninguna afiliación con Renfe ni con ninguna administración pública. Es un proyecto independiente construido sobre datos abiertos.

Datos abiertos de Renfe

Renfe publica sus datos de transporte en el portal data.renfe.com bajo licencia Creative Commons Attribution 4.0 (CC BY 4.0), lo que permite su uso, distribución y análisis citando la fuente.

GTFS Estático
Horarios programados, estaciones y rutas. Se actualiza cuando Renfe publica un nuevo horario (aproximadamente con cada cambio de servicio). Contiene dos feeds: Cercanías y AVE / Larga y Media Distancia.
Formato: ZIP con CSV · Caché: 24h
GTFS-RT (Tiempo real)
Actualizaciones en vivo de cada tren: retrasos acumulados por parada para Cercanías, y retraso global del trayecto para Larga Distancia. Se consulta en cada ejecución del pipeline, cada hora.
Formato: JSON / Protocol Buffer · Sin caché
Nota sobre AVE y Larga Distancia: Renfe publica un feed de tiempo real para trenes de larga distancia con el retraso agregado del tren, no por parada individual. Para Cercanías sí existe el detalle por parada. Los servicios de Media Distancia sin feed RT aparecen como "en hora" al no existir información de retrasos disponible.

Cómo se calculan los retrasos

En cada ejecución, el pipeline cruza los horarios programados (GTFS estático) con los datos en tiempo real (GTFS-RT) para el tramo de 60 minutos hacia adelante desde el momento actual. Solo se analizan los trenes que tienen llegada prevista en ese intervalo.

En hora Retraso igual o inferior a 1 minuto
Retraso leve Entre 1 y 5 minutos de retraso
Retraso alto Más de 5 minutos de retraso
Cancelado El tren figura como cancelado en el feed RT

Cuando no hay datos de tiempo real disponibles para un tren (el feed RT no lo incluye), se asume que está en hora. Esto puede subestimar los retrasos reales en servicios sin cobertura RT completa.

El retraso que se muestra es el retraso en la llegada a la estación consultada, no el retraso de salida en origen. Un tren que sale con retraso puede recuperar o acumular tiempo a lo largo del trayecto.

Cómo se publican los datos

Todo el proceso es completamente automático. Un servidor privado (VPS) ejecuta el pipeline cada hora mediante una tarea programada (cron job). Los datos generados se publican en este sitio web sin intervención manual.

Cada hora
El cron job lanza el script en el VPS
Descarga GTFS
Horarios estáticos (caché 24h) + datos RT en vivo
Procesa y cruza
Calcula retrasos para los próximos 60 minutos
Publica en GitHub
JSON generado → commit automático → push
Vercel redeploy
El sitio se reconstruye con los nuevos datos
El pipeline está escrito en Python. El sitio web es un sitio estático generado con Astro y publicado en Vercel. Los datos se almacenan como ficheros JSON en el repositorio de GitHub, sin base de datos.

Qué no mide este proyecto

·
Trenes sin cobertura RT
Los servicios de Media Distancia sin feed de tiempo real aparecen siempre como "en hora". No es que no tengan retrasos — es que Renfe no publica esa información públicamente.
·
Retrasos inferiores a 1 minuto
Los trenes que llegan con menos de 60 segundos de retraso se contabilizan como puntuales, siguiendo el criterio oficial de Renfe.
·
Causas del retraso
El feed GTFS-RT proporciona el dato de retraso pero no su causa (incidencia técnica, congestión, meteorología, etc.). No es posible desglosar por motivo.
·
Ventana de 60 minutos
Cada snapshot cubre únicamente los trenes con llegada en la próxima hora. Los servicios nocturnos o de baja frecuencia pueden no aparecer en todas las ejecuciones.
·
Histórico desde el inicio del proyecto
Solo hay datos desde que este proyecto empezó a funcionar. No existe historial anterior a esa fecha.

¿Qué significan los indicadores estadísticos?

¿Qué es el percentil p50 (mediana)?

Si hay 100 trenes con retraso ordenados de menor a mayor, el p50 es el valor que está exactamente en el medio: la mitad llega con ese retraso o menos, y la otra mitad tarda más. También se llama mediana.

Por ejemplo, un p50 de 8 minutos significa que al menos la mitad de los trenes retrasados llegan con 8 minutos o menos de retraso. Es la medida más representativa del retraso "típico".

¿Y el p75 y el p90?

El p75 es el valor que solo supera 1 de cada 4 trenes retrasados. Si es 19 minutos, el 75% de los trenes retrasados llegan en 19 minutos o menos.

El p90 es el valor que el 90% de los trenes retrasados no supera. Si el p90 es 30 minutos, significa que 9 de cada 10 trenes retrasados llegaron con 30 minutos o menos de retraso —solo el 10% restante lo superó. No al revés: no significa que el 90% llegara con más de 30 minutos.

¿Por qué no basta con la media de retrasos?

La media es fácil de calcular, pero puede engañar. Un único tren con 2 horas de retraso eleva la media de todos los demás aunque el resto lleguen con 5 minutos.

Los percentiles describen la distribución real: puedes saber si los retrasos son generalmente pequeños con algún caso extremo aislado, o si todos los trenes acumulan retraso de forma parecida. Ambas situaciones pueden tener la misma media, pero son muy diferentes en la práctica.

¿Qué es la línea de tendencia del gráfico histórico?

Es una regresión lineal calculada sobre el porcentaje diario de trenes con retraso. En términos sencillos, es la "línea recta que mejor se ajusta" a los datos pasados y permite ver si los retrasos están mejorando o empeorando globalmente a lo largo del tiempo.

Una línea que sube indica tendencia a empeorar; si baja, a mejorar. Es una aproximación simple —no tiene en cuenta estacionalidad ni eventos puntuales— pero útil para detectar derivas a largo plazo que no se aprecian día a día.

¿Qué muestra el gráfico "Por hora"?

Agrupa todos los datos históricos por franja horaria (independientemente del día concreto) y calcula el porcentaje medio de trenes retrasados en cada hora del día. Permite detectar si hay horas que sistemáticamente concentran más retrasos: picos de entrada al trabajo, horas punta de tarde, etc.

La opacidad de las barras indica cuántas muestras hay para esa franja: las horas nocturnas con pocos trenes tienen barras más tenues porque la estimación es menos fiable.

¿Por qué algunos trenes siempre aparecen "en hora"?

Los servicios de Media Distancia sin cobertura de tiempo real aparecen siempre como en hora porque Renfe no publica ese dato en su feed público GTFS-RT. No es que no tengan retrasos: es que la información no está disponible.

Este es un límite del sistema de datos abiertos de Renfe, no del pipeline de enhora.info. Los datos de Cercanías y AVE/Larga Distancia sí tienen cobertura RT.

Código abierto

Todo el código de este proyecto —el pipeline de Python y el sitio web en Astro— es público. Cualquier persona puede revisarlo, auditarlo o reutilizarlo bajo los términos de su licencia.

Si encuentras un error en los datos, en el método de cálculo o en el código, puedes reportarlo abriendo un issue en el repositorio.