The UK train station with most cancellations in 2026
Train cancellations 2026
In 2026, some UK stations saw more than 1 in 3 trains cancelled. Let’s find out which.
Over the past year, I have been collecting train service data from National Rail - tracking each train’s movements, delays and cancellations. I am now developing new visualisations to shed light on the network’s performance. In today’s article, let’s explore cancellations across the network in 2026.
The dataset
Before we get into the results , I’d like to touch on the dataset itself. The Darwin real-time feed generates a message every time a train reaches a station, along with updates on estimated times for later stops. This means a single train can publish hundreds of messages. For 2026 alone, that’s over 500 million rows. Analysing data at this scale can get expensive fast (you may have noticed that all my previous analysis focuses on a single location - that’s not a coincidence!).
To bring the cost down, I used a common data engineering technique: normalisation. Taking our complex, often messy, rows of train locations and marshalling them into a single, standardised format for each service that we can quickly operate over. Doing this, I reduced down our dataset to ~1.5 million rows - much more manageable!
Building the query
Let’s build a query! There are a few things we need to consider:
- Train locations are identified by TIPLOC codes but large stations can have several of these. By looking up the CRS Code from the TIPLOC we can aggregate these results into a single station.
- We want to count distinct services cancelled. If a service visits the same station twice (for example, it’s a loop), we only want this counted once.
- We’re only interested in passenger stops — not stations a train passes through without stopping.
- We want to filter out non-passenger services, such as empty stock movements.
With that, we have our query! You can see it in the appendix below. Now, onto the results.
Results
Here are the top thirty results, ordered by cancellation rate - the percentage of scheduled services that were cancelled. This analysis covers services from 1 January 2026 to 21 February 2026 (year-to-date).
| # | Station | Total Services | Cancelled | Full | Partial | Rate |
|---|---|---|---|---|---|---|
| 1 | St Keyne Wishing Well Halt | 149 | 56 | 56 | 0 | 37.6% |
| 2 | Causeland | 149 | 56 | 56 | 0 | 37.6% |
| 3 | Kings Nympton | 507 | 112 | 42 | 70 | 22.1% |
| 4 | Morchard Road | 1,231 | 262 | 91 | 171 | 21.3% |
| 5 | Copplestone | 1,251 | 265 | 94 | 171 | 21.2% |
| 6 | Yeoford | 1,266 | 269 | 98 | 171 | 21.2% |
| 7 | Umberleigh | 1,274 | 268 | 97 | 171 | 21.0% |
| 8 | Eggesford | 1,305 | 269 | 99 | 170 | 20.6% |
| 9 | Ockley | 1,229 | 250 | 31 | 219 | 20.3% |
| 10 | Holmwood | 1,237 | 226 | 7 | 219 | 18.3% |
| 11 | Lapford | 551 | 101 | 29 | 72 | 18.3% |
| 12 | Warnham | 1,237 | 226 | 7 | 219 | 18.3% |
| 13 | Newquay | 648 | 112 | 104 | 8 | 17.3% |
| 14 | Luxulyan | 599 | 103 | 93 | 10 | 17.2% |
| 15 | Chapelton (Devon) | 217 | 37 | 16 | 21 | 17.1% |
| 16 | Bugle | 624 | 106 | 96 | 10 | 17.0% |
| 17 | Portsmouth Arms | 255 | 43 | 20 | 23 | 16.9% |
| 18 | Roche | 624 | 105 | 96 | 9 | 16.8% |
| 19 | Quintrell Downs | 624 | 104 | 96 | 8 | 16.7% |
| 20 | St Columb Road | 624 | 104 | 96 | 8 | 16.7% |
| 21 | Thurso | 310 | 51 | 21 | 30 | 16.5% |
| 22 | Georgemas Junction | 310 | 47 | 21 | 26 | 15.2% |
| 23 | Sandplace | 584 | 78 | 78 | 0 | 13.4% |
| 24 | Looe | 720 | 95 | 95 | 0 | 13.2% |
| 25 | Kinbrace | 273 | 34 | 20 | 14 | 12.5% |
| 26 | Scotscalder | 273 | 34 | 20 | 14 | 12.5% |
| 27 | Altnabreac | 273 | 34 | 20 | 14 | 12.5% |
| 28 | Kildonan | 310 | 38 | 21 | 17 | 12.3% |
| 29 | Forsinard | 310 | 38 | 21 | 17 | 12.3% |
| 30 | Wick | 310 | 37 | 21 | 16 | 11.9% |
Note: A partially cancelled service is one that stopped at the station but did not complete its full scheduled route — for example, terminating early.
Unless you’re a real rail nut (or a local) I’d guess you’ve not heard of quite a few of these stations. That’s because they cluster around five lines:
- Tarka line (Cornwall, Exeter to Barnstaple)
- Looe Valley line (Cornwall, to Looe)
- Atlantic Coast line (Cornwall, to Newquay)
- Far North line (Scotland, to Thurso and Wick)
- Mole Valley line (Sussex, to Horsham and Epsom)
The Cornish lines are perhaps the least surprising entry here. The monumental rainfall in January and February closed both the Looe Valley and Atlantic Coast lines to all traffic for significant stretches of time. This also applies to the Mole Valley line, which suffered a landslip at the end of January.
The Far North line tells a different story: as far as I can tell it hasn’t faced the same weather-related closures, but given how remote it is (Altnabreac, for instance, is arguably the most isolated station in Britain), its not a huge shock to see it featured.
We can see these stations visualised below:
Results: A bigger picture
Now we can run more efficient queries, why limit ourselves to 30 stations! Let’s generate a visualisation across the entire UK.
From this, we can see our top 5 cancelled lines clearly - orange in a sea of green! We can also see other lines which struggle with cancellations, such as the stunning Heart of Wales line. Switching from percentage cancelled to absolute number cancelled reveals a very different story. High-frequency urban corridors, while operationally more resilient, generate far larger absolute cancellation numbers simply because they run far more trains. Only the lines north of Ipswich excelled in minimising the services cancelled.
Cancellation percentages alone don’t tell the whole story. Rural lines dominate the league table, but major commuter corridors account for far more cancelled journeys in absolute terms.
In future articles, I’ll explore multi-year trends to see whether 2026 is an anomaly or part of a deeper structural issue in Britain’s rail network.
Appendix
SQL to compute the above datasets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-- Stations ranked by cancellation percentage for 2026 year-to-date.
-- Uses normalised_v1 (one row per service) with the stops array for efficient station filtering.
-- Pass-through timing points excluded via arr_sched/dep_sched filter.
-- Multi-TIPLOC stations (e.g. Clapham Junction) aggregated via CRS code.
WITH all_stops AS (
SELECT
stop.tpl AS tpl,
rid,
cancellation_status,
stop.cancelled AS stop_cancelled
FROM normalised_v1
CROSS JOIN UNNEST(stops) AS t(stop)
WHERE year = '2026'
AND passenger = true
AND (stop.arr_sched IS NOT NULL OR stop.dep_sched IS NOT NULL)
),
station_stats AS (
SELECT
COALESCE(t.CrsCode, s.tpl) AS station_id,
MIN(t.StationName) AS station_name,
COUNT(DISTINCT s.rid) AS total_services,
COUNT(DISTINCT CASE
WHEN s.stop_cancelled = true
AND s.cancellation_status IN ('cancelled', 'partially_cancelled')
THEN s.rid END) AS total_cancelled_services,
COUNT(DISTINCT CASE
WHEN s.stop_cancelled = true
AND s.cancellation_status = 'cancelled'
THEN s.rid END) AS from_full_cancellations,
COUNT(DISTINCT CASE
WHEN s.stop_cancelled = true
AND s.cancellation_status = 'partially_cancelled'
THEN s.rid END) AS from_partial_cancellations
FROM all_stops s
LEFT JOIN tiplocs t ON s.tpl = t.TiplocCode
GROUP BY COALESCE(t.CrsCode, s.tpl)
)
SELECT
station_id,
station_name,
total_services,
total_cancelled_services,
from_full_cancellations,
from_partial_cancellations,
ROUND(100.0 * total_cancelled_services / total_services, 1) AS cancellation_rate_pct
FROM station_stats
WHERE total_services >= 100
ORDER BY cancellation_rate_pct DESC
LIMIT 30