Method
Trust is our most important asset. This page explains where our numbers come from, how we calculate them, what we leave out and where the limits are.
Where the data comes from
We use public timetable data from Deutsche Bahn (Timetables API). Piet Brömmel collects it and publishes it as an open dataset under the CC BY 4.0 licence, in monthly files. We do not use any live interface of the railway. We keep our own copy of every file we use and check its checksum when loading.
What “on time” means
We take the delay at the stop (at departure, otherwise at arrival) in whole minutes. On time means less than 6 minutes late. We count over all stops that took place. Cancelled stops are counted separately and are not treated as late. The actual time is the last reported time; if no change was reported for a stop, the source uses the planned time and the stop counts as on time.
What we leave out
We leave out ghost rows, additional stops and stops of replacement trains. That is about 1.2 percent of the rows. Months in which too many hours are missing in the source data (so far July 2026) are missing from our rankings. For record days we only use days with complete data.
Comparison with the railway's official figures
From month to month our values follow the railway's official punctuality figures (correlation 0.97 to 0.99 over ten months). Our level is lower, though: about 2 percentage points for comparable trains and 2.5 to 3 points for all operators together. The railway most likely does not count cancelled stops as late. That is why we never call our numbers “the railway's punctuality”.
Time of day and weekday
The hour is the planned hour of the stop. According to its description, the source's timestamps are German local time (Europe/Berlin) without a time zone, and the daily patterns (commuter peaks around 7 to 8 and 17 to 18, a quiet night) fit that. On the nights of the clock change this can lead to differences of one hour; we have not treated those nights separately.
Limits
Train stops are scheduled stops, not passengers. We don't know how full a train was. Station rankings depend on which train types stop there, so we compare long-distance, regional and S-Bahn separately. Far fewer trains run at night, so values there are less stable. All figures are historical and no guarantee for the future.
Updates and corrections
We load new months automatically as soon as the source publishes them. The rankings and charts on this site are updated by hand. Please report errors to info@infinitmomentum.com, and we will check and correct them.
Dutch data
For the Netherlands we use the train archive of Rijden de Treinen (licence CC BY 4.0), which is based on real-time data of NS: one row per stop with the planned time, the delay in minutes and a cancelled flag, with data since 2019. The same rules as above apply (delay at departure, otherwise at arrival; on time means under 6 minutes, counted over the stops that ran). NS itself counts from 3 minutes. Our Dutch figures are therefore not comparable with NS's official figures.
We leave out stops with more than 600 minutes of delay: there are very few and they are most likely data errors (0.009 percent in August 2026). Replacement buses count as neither long-distance nor regional. Long distance means Intercity, Intercity direct, ICE, EuroCity, Eurostar and night trains; regional means Sprinter, Stoptrein and Sneltrein. A few stops abroad (for example in Germany or Belgium) belong to Dutch services and are included in the figures. The cancellation share counts stops, not whole trains. We use the station coordinates (Rijden de Treinen, CC0) and the track data (ProRail, CC0 according to the catalogue) only for animations.
Swiss data
For Switzerland we use the actual data (Ist-Daten) of opentransportdata.swiss (source: opentransportdata.swiss). It is not a Creative Commons licence; the terms of use of the platform apply. We publish our analysis and summaries under our own name. The data holds, per stop, the planned time and the actual time or the last forecast received. We count measured times only: stops without a measured time (about 2 percent of stops) are left out, cancelled stops always count. The same rules as above apply: on time means under 6 minutes, counted over the stops that ran. SBB counts from 3 minutes. Our Swiss figures are therefore not comparable with SBB's official figures. Where the source delivers the last forecast received as the actual time, values can come out too favourable. They are also not directly comparable with Germany or the Netherlands.
We analyse trains only (buses, trams and boats in the source are left out) and only stops in Switzerland: the foreign parts of cross-border trains are missing in the monthly file. We do not count pass-throughs without a stop, and we leave out delays above 600 minutes. Long distance means IC, IR, EC, ICE, TGV, RJX, NJ and PE; S-Bahn means S and SN; regional means all other train types. The cancellation share counts stops, not whole trains: in May 2026, 5.3 percent of trips had at least one cancelled stop and 1.1 percent were cancelled completely. The archive ends in June 2026; our period is November 2025 to June 2026.
Belgian data
For Belgium we use Infrabel's open punctuality data (licence CC0): one row per measurement point of a train on an operating day, with planned and actual time and the delay in seconds. The source contains only trains that actually ran. Cancelled trains are missing, so we show no cancellation rate for Belgium and the figures are more favourable than reality. They are not comparable with the other countries. As everywhere, we count a delay from 6 minutes (departure delay, else arrival delay, rounded down to whole minutes). Infrabel and SNCB use their own measures.
The files also list measurement points where a train only passes through. A row where the actual arrival and the actual departure are identical to the second is treated as a pass-through and not counted. In a check this was wrongly true for less than about 1 percent of certain stops. We drop delays over 600 minutes. The period is January to August 2026: before that, S-trains were labelled differently in the source, so the split by train class would not be comparable. Long distance is IC, ICE, EC, TGV, Thalys, Eurostar and international trains (INT), regional is L and P, S-train is the S-trains. Extra and special trains are not shown.
Coordinates of the measurement points and the tracks for the videos come from Infrabel's open data (CC0). We assign provinces and municipalities to the measurement points using Eurostat GISCO administrative boundaries (© EuroGeographics); the Brussels-Capital Region counts as a unit of its own.
Lines
For regional and S-Bahn trains the data only holds a short line code such as S1 or RE1, and the same code is used in many networks. So for every month we group stops with the same code into a line when they are connected through consecutive stations (at least 3 rides per connection). The same code in different cities shares no station and separates by itself.
To keep a line the same over the months, we match every month's groups to the lines we already know (same code, at least 30 percent shared stations). If a line is run differently for a while, it can fall apart into two lines; we see this with single lines (for example in Stuttgart and Leipzig). Names are created once when a line is created and can have quirks (the Nuremberg S1 is named after Erlangen).
All line figures are our analysis of the public timetable data, not a measurement by Deutsche Bahn or any transport company.
How much extra time should I plan? (station page)
For one station, one train type (long distance, regional or S-Bahn), one day group (Monday to Thursday, Friday, Saturday or Sunday) and one planned hour, the page shows what share of the stops that ran was on time (less than 6 minutes late) and what share was 6 minutes or more late, what share of the stops was cancelled, plus the median delay and a buffer. All stops of the months we analysed in that hour are counted; the page itself names the period. We do not remove public or school holidays. Source and exclusions are the same as above.
Two measures. “I get off here” counts the arrival delay: actual minus planned arrival time at this station, in whole minutes. The hour is the planned arrival hour, and a stop counts as cancelled if its arrival is cancelled. “I get on here” counts the departure delay with the planned departure hour; a stop counts as cancelled if its arrival or its departure is cancelled, as in the other tables on this website. The first stop of a trip has no arrival and is therefore missing from “I get off here”; the last stop has no departure and is missing from “I get on here”. The actual time is the last reported time; if no change was reported, the source uses the planned time and the stop counts as on time (0 minutes). A stop without an actual time therefore does not exist in the data.
The two measures often differ. For stops that ran and have all four times (planned and actual arrival and departure), the arrival delay from November 2025 to September 2026 (without July) equalled the departure delay in 52.9 percent of the cases, was larger in 16.1 percent and smaller in 31.0 percent. On average it was 0.24 minutes lower. The other tables on this website count the delay at departure (the arrival only at the last stop of a trip); the arrival figures on this page are therefore not comparable with them.
The buffer is the delay that 9 of 10 stops that ran did not exceed: the smallest whole minute at which at least 90 percent of the stops that ran had at most that much delay (the 90th percentile). Before calculating it we cap delays to between −15 and +300 minutes; a stop with 8 hours of delay counts for this like one with 5 hours. If the value is 0 or negative we show “no later than scheduled” and a buffer of 0. We show an hour only if it has at least 30 stops (cancelled ones included) and at least one stop that ran. We do not round up and we do not merge hours.
We test the analysis against itself. We build all figures from all months except the newest and check them against the newest month: what share of the stops that ran fell within the buffer we show (target: 90 percent), and how far off was the predicted share of on-time and cancelled stops? For comparison we use a simple estimate without station knowledge: the average of the whole network for the same train type, day group and hour. The result with September 2026 as the test month: across all stations the buffer comes close to 90 percent on average, and the network average comes almost as close. For long distance both are below, the station buffer somewhat closer to 90 percent; for S-Bahn both are above. Station data therefore does not improve how well the buffer covers overall. It estimates the share of on-time stops clearly better (off by about 6 instead of 10 percentage points on average) and the share of cancelled stops only slightly better (by about 0.4 percentage points). Only station hours with at least 30 stops that ran in the test month are tested, about a quarter of the published hours; for about 44 percent of those the coverage was outside 85 to 95 percent. The test result applies to all stations together, not to a single one; the page itself shows the exact values of the latest test.
Limits: the figures describe how this station looked in the past. They are not a forecast and not a journey from A to B; travel time, the other station and missed connections are not included. This is not Deutsche Bahn's own measurement. We rebuild the files per station by hand when new months are loaded.