115,000 real taxi rides from Midtown to the airport: how long the ride takes at each hour, and how unlucky you can get
Every yellow taxi ride in 2023 from Midtown Manhattan to JFK or LaGuardia, grouped by the hour it started.
How to read the chart. Pick an hour on the bottom axis and read straight up. Imagine 100 taxi rides that left Midtown in that hour, lined up from the fastest to the slowest:
Thick line: ride number 50, the typical ride. Half the rides were faster, half slower.
Dark band: rides 25 to 75, the middle half of the line-up.
Light band: rides 10 to 90. Its top edge is ride number 90: only 10 rides in 100 were slower. That is the time to plan for if you cannot afford to be late.
For example, at 4 p.m. on a weekday, ride 10 took 56 minutes, ride 50 took 74 and ride 90 took 93.
NoteBefore you look: predict
You take a taxi from Midtown to JFK at 4 p.m. on a weekday. How much time should you allow so that nine times out of ten you get there in time: 45 minutes, an hour, or an hour and a half?
T =FileAttachment("data/taxi-airports.json").json()viewof airport = Inputs.radio(["JFK","LaGuardia"], {value:"JFK",label:"Airport"})viewof daytype = Inputs.radio(["weekday","weekend"], {value:"weekday",label:"Day"})
ride 50 of 100 (typical)rides 25 to 75rides 10 to 90
viewof leave = Inputs.range([0,23], {value:16,step:1,label:"I leave at (hour)"})viewof budget = Inputs.radio([45,60,75], {value:60,label:"I allow (minutes)",format: m =>`${m} min`})
{const r = T.airports[airport][daytype][leave];if (!r) returnmd`Too few taxi rides at this hour to say.`;const p = r.under[[45,60,75].indexOf(budget)], when = leave ===0?"midnight": leave ===12?"noon": leave <12?`${leave} a.m.`:`${leave -12} p.m.`;returnmd`Leaving at **${when}** on a ${daytype} with **${budget} minutes** to reach ${airport}: you make it **${Math.round(100* p)} times out of 100**.- Ride 50 of 100, the typical ride: **${Math.round(r.p[2])} minutes**.- Rides 25 to 75 of 100: ${Math.round(r.p[1])} to ${Math.round(r.p[3])} minutes.- Rides 10 to 90 of 100: ${Math.round(r.p[0])} to ${Math.round(r.p[4])} minutes; 10 rides in 100 took **over ${Math.round(r.p[4])}**.(${r.n.toLocaleString()} rides in 2023.)`;}
What it shows
The average is not what makes you miss a flight; the spread is. At 4 p.m. the typical ride to JFK takes about two and a half times as long as at 2 a.m., and the unlucky tenth of rides take about 20 minutes more than the typical one. Traffic engineers call that extra margin the buffer time: how much more than the average a traveller must allow to arrive on time nearly always. Agencies measure a road’s reliability this way, and so should you before a flight.
Data: New York City Taxi and Limousine Commission, 2023 Yellow Taxi Trip Data, NYC Open Data. Rides from TLC zones 161–164 (Midtown) and 230 (Times Square) to zone 132 (JFK) or 138 (LaGuardia); trip times are meter times, from pickup to drop-off, and rides under 8 or over 180 minutes are left out.
theme = Generators.observe(notify => {const read = () =>notify(document.body.classList.contains("quarto-dark") ?"dark":"light");read();const watcher =newMutationObserver(read); watcher.observe(document.body, {attributes:true,attributeFilter: ["class"]});return () => watcher.disconnect();})accent = theme ==="dark"?"#c9a0ff":"#57068c"ink = theme ==="dark"?"#f2f2f2":"black"plotW = Generators.observe(notify => {let last;const read = () => {const main =document.querySelector("main"), fit = main ? main.clientWidth-50:640;const w =!document.querySelector(".reveal") && fit <640?Math.max(240,Math.floor(fit)) :640;if (w !== last) notify(last = w); };read();window.addEventListener("resize", read);return () =>window.removeEventListener("resize", read);})