DelayometerLondon rail, measured

Method

How a delay becomes a number

TfL publishes two quite different things. One is a declared status — “Good Service”, “Minor Delays” — set by people in a control room, and it is authoritative about what they have decided. The other is a live feed of arrival predictions: every train the signalling system can see, where it is, and when it expects to reach each platform ahead of it.

Delayometer ignores the first and measures the second. Everything below is what happens between that feed and the number on the front page.

Two signals, not one

A journey gets longer in two different ways, and confusing them makes a status product useless. So we measure both, separately:

Waiting time. At each platform, in each direction, we sort the trains due by how far away they are. The gaps between them are the headways — how long you would wait, arriving at random. Trains that appear twice in the same feed are deduplicated first, because otherwise we would invent gaps nobody experiences.

Running time. Where TfL gives a train an identifier we can follow, we watch the same train reach one station and then the next, and take the difference. That is how fast the line is actually moving, as opposed to how often something arrives.

A line can fail either way, and the pair is what separates “busy but moving” from “stopped”. Both are compared against normal, blended into one score per section of track, then smoothed so that a single odd reading does not repaint the map.

Normal is a measurement too

“Four minutes between trains” means nothing on its own. At Oxford Circus on a Tuesday at 08:30 it is a problem; at Upminster on a Sunday evening it is the timetable. So every comparison is against a baseline built for that station, that direction, that kind of day, and that fifteen minutes of it — from weeks of our own measurements, in London local time so the clock changes do not smear the morning peak.

Periods where TfL had declared disruption are excluded from the baseline. Without that, a line that is chronically late slowly teaches the system that late is normal, and then stops being reported as late at all — which is the single easiest way to build a status product that is quietly worthless.

The score

Each section of track gets 0–100, where 100 is running as it usually does. Those roll up to a direction and then to a line, and the number is always paired with words, because “62” is not a thing anyone can act on and “about two minutes longer than usual” is.

The bands are fixed: 90 and above is running normally, 75 and above is a minor delay, 35 and above is delayed, and below that is severe. A line whose label says it is running normally is never coloured as though it is not — under a minute added to a journey is inside the noise, and quoting it would be a precision the measurement does not have.

What we do not know, and say so

Grey is not green. A section nobody has been measured across yet is grey and reads Measuring. This matters more than any other rule here: a status product that renders missing data as a good service is worse than no status product at all, so nothing on this site turns an absence into a reassurance.

A line in constant trouble becomes harder to measure, not easier. Because declared-disruption periods are kept out of the baselines, a line TfL has flagged for much of the week loses most of its samples for those hours — and with no picture of normal for, say, a Tuesday evening, there is nothing left to compare a Tuesday evening against. Over half the Central line’s measurements are currently excluded this way, which is why its evenings often read Measuring rather than carrying a score. We would rather keep the exclusion and lose the coverage than let a chronically late line quietly redefine what late means, but the cost lands exactly where a measurement would be most useful, and we would rather you knew that than wondered.

The DLR has no train identifiers. Its feed does not name its trains, so we can measure how long you wait but never how fast the train then goes. It is scored from waiting times alone, permanently, and its confidence is capped to say so.

Shared track is not yet separated. The Circle, District, Hammersmith & City and Metropolitan lines share rails for much of central London. Congestion there is currently counted against every line that runs over it, which is right often enough to be useful and wrong often enough to be worth telling you about.

Planned closures are not modelled yet. Engineering works and part suspensions can read as an absence of service. Long gaps are discarded and declared disruption is kept out of the baselines, but a closure is not yet something we recognise by name.

Old data is hidden, not dimmed. If our collector stops, the measurement disappears rather than lingering. A twenty-minute-old score presented as current is a fabrication, and the fastest way to lose the only thing this product sells.

Where the data comes from

Everything is derived from TfL’s Unified API, the same open feed that powers every other app in this category. What differs is that we keep the raw record and do the arithmetic, rather than relaying the status TfL declares over the top of it.

Powered by TfL Open Data. Contains OS data © Crown copyright and database rights. Delayometer is not affiliated with Transport for London, and the measurements here are ours, not theirs.

See every line