The best and worst times to fly, from 7,001,619 flights
Every US domestic flight of 2025, boiled down to four rules you can book by.
Open full sheet ↗
Where this came from
Episode 1 started with a text message. Thomas, stuck at a gate, watching a "one-hour weather delay" quietly become three: "There's an incredible amount of almost incomprehensible variability." Eric spent the week rebuilding a full day of the US air-traffic system as a simulation to answer him. Along the way we ran the entire 2025 federal on-time record, all 7,001,619 domestic flights, looking for the patterns a traveler can act on. Four rules fell out. This is the cheat sheet.
The four rules
- Book before 9 a.m. A 6 a.m. departure arrives late about 10% of the time; by 7 p.m. it is 32%. Same airline, same route.
- Fly Tuesday or Wednesday. Sunday is the worst day in the sky (25.8% late), Monday second.
- Departing after 3 p.m.? Pad your calendar 60-90 minutes. That is the 90th percentile delay, not paranoia.
- Never book the last flight out. Cancellation risk peaks at night (2.5%+ after 10 p.m.), and there is no rebooking until morning.
What time of day has the fewest flight delays?
First thing in the morning, and it isn't close. A 6 a.m. departure arrives 15+ minutes late about 10% of the time. The share climbs almost every hour after that — 21% by late morning, past 25% mid-afternoon — and peaks at 32% in the early evening. The tail gets ugly too: when a 7 p.m. flight does run late, the 90th-percentile arrival delay is 77 minutes, versus 15 minutes for the 6 a.m. bank. Same airline, same route; the only thing that changed is how many legs your aircraft flew before it got to you. By 7 p.m. it has typically flown four.
What is the best day of the week to fly?
Tuesday (18.1% of arrivals late), with Wednesday just behind at 19%. The worst is Sunday at 25.8% — the weekend-return crush — with Monday, Thursday, and Friday clustered around 23%. If your schedule bends at all, a Tuesday-morning departure stacks both rules in your favor.
When are flights most likely to be cancelled?
Late at night. Cancellation risk sits near 1.1% through the middle of the day, then climbs all evening: 1.7% at 4 p.m., 2.0% at 6 p.m., 2.5% by 10 p.m. The rate is only part of the problem — a 10 a.m. cancellation gets you rebooked on the next bank, while a 10 p.m. cancellation has no same-day fallback. That's a hotel night. It's why "never book the last flight out" survives as a rule even though the absolute numbers look small.
Which airports are worst in the evening?
Among the busiest origins, evening departures (5 p.m. onward) run latest out of Orlando (37.2% late, P90 94 minutes), Boston (36.2%), and Washington National (36.2%, P90 101 minutes); LaGuardia matches that 101-minute P90. But look at the spread: the tenth-worst hub, Newark, is still at 33.3%. Every big airport lives in the same 33-37% band, because the evening problem is the network's, not any one airport's.
Why all four rules are the same rule
Your plane inherits delay from wherever it flew earlier in the day. In the official 2025 cause attribution, "late-arriving aircraft" accounts for 39.2% of all delay minutes. Extreme weather: 6.4%. Morning flights run clean because the plane slept at the gate and has nothing to inherit; by evening, whatever went wrong anywhere upstream has compounded into your boarding time.
One honest footnote: the weather bucket only counts extreme weather coded as such. An ordinary thunderstorm slowdown mostly lands in the "National Aviation System" bucket (21.9%), and yesterday's storm shows up today as a late aircraft three flights downstream. Weather's true fingerprint is bigger than 6.4%. The headline holds either way: the biggest single reason your flight is late is that your airplane was late somewhere else first.
Check it yourself
The full dataset is free on our data page: one parquet file per year, 2003-2025. DuckDB reads it straight off the URL. The hourly curve behind rule 1:
SELECT substr(crs_dep_time, 1, 2) AS dep_hour,
round(100.0*avg((arr_delay >= 15)::int), 1) AS pct_late
FROM read_parquet('https://data.mathvsvibes.com/bts/bts_2025.parquet')
WHERE cancelled = 0
GROUP BY 1 ORDER BY 1;
Receipt trail: posted as a self-post on r/Flights (161 points, 52 comments). Source: US DOT Bureau of Transportation Statistics, Reporting Carrier On-Time Performance. Public domain.