Bad Bus

Public transport in Dublin compared to Zürich

Updated live using GTFS and GTFS-RT data from both cities

Scroll to explore

Which services are running late right now?

Latest readings

Loading observations…
Historical period

The time filter changes historical comparisons; latest readings keep updating.

Typical wait times over the last seven days

All times · scheduled local time
Loading wait estimates…
Waits are estimated from final retained forecasts. Early departures use the next recorded passing service; unknown waits are excluded.
How this is calculated

Passenger waits. We assume you reach the stop one minute before departure. The last retained arrival and departure forecasts estimate when each vehicle passed. If it left before you arrived, we look for the next passing vehicle of the same route and direction at that stop. Each trip-stop counts once.

Unknown waits are excluded: these include missing later vehicles, collection gaps, waits over two hours, and final forecasts more than 10 minutes old in Dublin or 30 minutes old in Zürich. The curve uses 30-second bins; σ measures variation across known waits. Rankings require 20 distinct trips and 20 known waits, ordered by the share over three minutes, then mean wait.

Late services. The large percentage is the share of currently positioned vehicles with a forecast delay over three minutes. Missing positions and route geometry limit this sample; it does not cover every running service. The historical comparison counts each trip once, using its average final retained delay across local stops. It is not a historical average of the live percentage.

Latest waits cover stops finalized in the past 30 minutes. Historical figures cover up to seven days. Time filters use scheduled local stop time: morning 06–10, midday 10–16, evening 16–20; Any includes overnight. These are forecast-based estimates, not independently measured arrivals. Sources: NTA ↗ and Swiss Open Data ↗. NTA supplies data as is and is not responsible for errors or inaccuracies.

Live vehicle positions

Rail Tram Bus Ferry · approximate pier links Late vehicle · reported GPS Estimated from timetable + delay
Dublin feed pendingZürich feed pending
How this is calculated

Red icons indicate forecast delays over three minutes. We use reported GPS where available; other positions are estimated from recent stop forecasts along matched routes. Ferry routes use approximate straight links between scheduled piers. Positions expire after at most three minutes without a fresh estimate. Missing forecasts or geometry can leave vehicles off the map and out of the live percentage. These forecasts do not establish whether a journey actually arrived late.

See your commute

Choose your start and destination, then compare the timetable with measured delays and the other city’s reliability.

How this is calculated

Timetable. A* searches prepared weekday timetable profiles, forward for departures and backward for arrival deadlines. Walking between any pair of points uses straight-line distance at 3.5 km/h; changing vehicles adds 90 seconds. Staying aboard adds no new boarding wait. Up to three distinct alternatives are checked against dated timetables. The search preserves alternatives with fewer changes and considers options within 45 minutes of its best result. Transit distances sum straight links between stops.

With local delays. Leave-start estimates use at least two complete observed journeys where available, otherwise 200 scenarios drawn from at least 20 comparable weekday trips. Arrive-by estimates use those scenarios to test earlier scheduled departures on the selected route. Boarding and alighting delays stay paired, and the timetable is replayed to account for early departures and missed connections. Observations are final retained forecasts, not independently measured passing times. If some scenarios cannot finish, we show their share and completed-only examples, without an overall mean.

Other-city estimate. The route, walking and nominal scheduled waits stay fixed. Vehicle speeds and mean effective waits are mapped to the other city using their signed distance from the local mean, measured in standard deviations, within the same vehicle type and time period. Wait variation uses the other city’s measured distribution, adjusted to that mapped service mean; it does not stretch the source service’s outliers. The table’s calculation note shows the mapping for each service. This comparison assumes independent waiting and riding times; it does not replay the other city’s actual connections.

Slider. The allowance is mean journey duration plus the chosen number of standard deviations. For arrive-by journeys, we search scheduled departures up to three hours earlier and choose the latest start whose mean plus the selected allowance fits before your deadline. Moving the slider recalculates connections and departure time. At 0σ, the itinerary shows mean activity durations, matching the table. At higher allowances, it shows the closest sampled on-time journey; longer scenarios can still arrive late. Leave-start examples use the sampled journey closest to the selected duration. The “commuting days” figure comes from the sampled share exceeding it, not a guaranteed return period. Cancellations and shared disruption are not modeled.

Route speeds throughout the day

Latest speeds

A 30-minute observation snapshot, compared with weekday means over seven days. Sample age is shown below each value. Estimated from final retained forecasts.

Average route speeds

Loading route speeds…
Weekday speeds use scheduled stop times, adjusted for measured delay changes where available. Morning is 09:00 in Dublin and 08:00 in Zürich; midday is 12:30 and evening is 17:15 in both cities.
How this is calculated

Headline speeds. Summed straight-line distances between consecutive stops are divided by summed estimated passing times, including dwell. Each trip-stop pair counts once. Latest values use the 30 minutes ending at the observation snapshot, before publication processing; weekday means use the last seven days. Final forecasts may arrive after a vehicle has passed. Pairs taking over two hours or implying over 200 km/h are excluded.

Route tables and profiles. Weekday trips within 45 minutes of the stated benchmark use scheduled times, adjusted by observed delay changes where available. Rankings require two trips; fewer than five are marked as limited. Some rail entries use the full route when too few stops fall inside the comparison area; these are labelled.

Profiles align trips by distance travelled. Grey dots mark stops from a representative trip; gaps indicate missing valid stretches. The walking reference is 4 km/h. Selecting a direction filters the daily speed plot. Straight links between stops understate distance, and therefore speed, on curved routes.

Frequent and predictable?

Each dot connects two stops about 5 km apart. Bottom left means frequent and predictable.

Loading service comparison…
How this is calculated

Frequency and riding-time variation. Each dot represents two stops 4–6 km apart inside the comparison area. Services of the same vehicle type connecting those stops are combined. The x-axis is their median scheduled departure gap; the y-axis is variation (σ) in estimated riding time, scaled to 5 km. Final boarding and alighting forecasts are paired within each trip. A dot needs 20 trips across two weekdays and three scheduled intervals. Walking, passenger waiting and cancellations are excluded.

Gaps between vehicles. Each service direction uses one boarding stop near the distance midpoint of its representative route inside the comparison area. Consecutive final arrival estimates give passing gaps; each trip counts once at that stop. Different services and directions are never combined into a single gap. Missing scheduled vehicles cause affected intervals to be excluded; we cannot distinguish missing reports from cancellations. Overtaking is retained.

The solid curves pool these intervals in one-minute bins; the final bin includes 60 minutes or more. Frequent services contribute more intervals. Dashed lines show the binned median scheduled gap for service directions with observed intervals. Both charts use collected weekdays and scheduled local time: morning 06–10, midday 10–16, evening 16–20; Any includes overnight. Search filters only its selected city. The other city remains a network comparison under the mode and time filters, not a matched service. All passing times are forecast-based estimates.

Estimated time to the centre

Allowance: journey time intended to reach the centre by 09:00 in Dublin or 08:00 in Zürich in 95% of modeled delay scenarios. This is a provisional estimate, not a guarantee.

Provisional travel allowance · 95th percentile
01530456075≥90 min
Dublin 08:45–09:00 · Zürich 07:45–08:00
Dublin feed pendingZürich feed pending
How this is calculated

We search the weekday timetable for journeys arriving at the marked centre between 08:45–09:00 in Dublin or 07:45–08:00 in Zürich. Each map point adds straight-line walking at 3.5 km/h to a usable stop, five minutes for boarding, and at least 90 seconds per transfer.

Collected delays supply scenarios; each scenario searches again for feasible connections. Typical shows the median shortest journey. Allowance shows the 95th-percentile time budget before the deadline, including early-arrival slack. This assumes you can choose services after seeing delays; it is not a demonstrated 95% success rate for a fixed commute.

Sparse morning samples fall back to all-day data. With too little delay data, the model uses the timetable alone. Cancellations, correlated disruption and changing delays within a trip are not modeled.

Where delays accumulate and recover

DublinZürich
Positive delay: late · negative delay: early
Loading trip profiles…
Each trip-stop counts once, using its final retained forecast. Charts show signed delay; the map shows the average change in delay between stops. Shading and whiskers show one standard deviation of the observations, not a confidence interval.
How this is calculated

Each finalized trip-stop contributes its last retained forecast once. Service directions are identified by their first and last scheduled stops. The lines show mean delay with ±1 standard deviation across stop observations, not uncertainty in the mean.

Journey plots use scheduled elapsed minutes or distance from the full trip’s start. Smoothing uses observations within 10 minutes or 5 km, weighted toward the plotted position. Hour and weekday use scheduled local departure time. Each plotted point needs 20 stop observations; short and long routes keep their actual lengths. Forecast delays beyond ±30 minutes are excluded (0 Dublin and 0 Zürich stops).

The map averages signed delay changes across distinct trips over seven days. Changes spanning up to 5 stop links are divided by scheduled travel time. Map geometry and faint stretches are explained below.

How delays change between stopsAverage change across sampled services · matched route geometry
Average delay change between stops
≤ −3 min0≥ +3 min
Faint lines have fewer observations or an estimated change. Grey rail lines have no matched delay sample.
Dublin feed pendingZürich feed pending
How this is calculated

Colour is the average change in forecast delay per directed stop-to-stop link over seven days, counted once per trip. Negative means recovery; positive means extra delay. Colours saturate at −3 and +3 minutes.

Faint stretches have only one or two samples, or changes apportioned across missing stops. Uncoloured stretches lack usable data or a credible mapped path. Lines follow imported GTFS or cantonal geometry where matched; short unmatched links can be straight connectors. Unmatched Zürich connectors over 200 m are omitted. Line width does not measure service frequency.

People working in the city

Loading employment figures…
How this is calculated

Published employment within each city includes people living elsewhere. The linked sources use different reporting periods and methods. Dublin’s displayed year identifies the city profile’s publication, not a common measurement year.

Fleet size & vehicle capacity

Estimated total fleet capacity
One-time passenger capacity · bus and tram capacity, train seats and published boat passenger limits
DublinZürich
Each icon represents one vehicle
Loading fleet figures…
Estimated capacity combines bus and tram seats and standing room, train seats, and published boat passenger limits. Boat figures cover ZSG only; Dublin boats are not included. Known vehicle types are counted directly; incomplete fleets use the example models listed above. This assumes every listed vehicle is available at once.
How this is calculated

Capacity is vehicle count × capacity per vehicle, summed across modes. Known model splits are used where available; otherwise the displayed example vehicle represents the fleet. Dublin trams use 40 short and 41 long vehicles.

Buses and trams include seats and standing room; trains include seats only. Zürich boats use ZSG’s 17-vessel roster: 7,240 maximum passengers, using 2024/25 specifications. Other shipping operators are excluded; Dublin’s boat fleet is unavailable and omitted from its total. This assumes every listed vehicle is available at once. Operator coverage and standing-capacity assumptions differ, so totals are approximate.

Train sources: DART ↗; SBB DPZ ↗, DTZ ↗ and Regio-Dosto ↗. Other sources are linked beside the figures.

Travel time and home prices

Loading property prices and travel times…
Dublin points are individual matched sales; Zürich points are area median apartment prices. Currencies, property types and periods differ. Travel times are modeled allowances for arrival by 09:00 in Dublin or 08:00 in Zürich.
How this is calculated

Dublin points are individually located sales from the latest 12 months in the downloaded register. Zürich points are annual apartment-price medians by city quarter; each point shows its year. Euros and Swiss francs use separate axes. Property types, dates and geographic detail differ.

Travel times use the provisional allowance model from the centre-access map, with arrival by 09:00 in Dublin or 08:00 in Zürich. Trend lines are ordinary least-squares fits. R² measures how much price variation the fitted line explains; it does not show that transport access caused the prices.

Provisional travel allowance · 95th percentile
01530456075≥90 min
Dublin 08:45–09:00 · Zürich 07:45–08:00
Property pricesDublin individual sales · Zürich quarter medians · approximate minutes to centre
Dublin feed pendingZürich feed pending
How this is calculated

Dublin pins are matched individual sales; hover or tap for the recorded description, date and price. Zürich pins place the latest available quarter-level apartment-price medians at representative stops, not individual buildings. Prices use their original currencies. Travel times use the preceding map’s provisional model.

Delay prediction accuracy

DublinZürich
Loading prediction history…
Lines show the average absolute difference between earlier and final retained forecasts. Shading shows ±1 standard deviation. The reference is an estimated passing time, not a measured arrival.
How this is calculated

Earlier delay forecasts are compared with the final retained forecast for the same trip-stop. The plot shows mean absolute error and ±1 standard deviation of those absolute errors. The reference is a passing-time estimate, not an independently measured arrival.

Each trip-stop contributes once per 60-second lead-time bin; the reference update never scores itself. Arrival forecasts are compared with arrivals. Departure-only references are labelled as proxies on hover. Forecasts or references beyond ±30 minutes are excluded.

Time filters use scheduled local stop time: morning 06–10, midday 10–16, evening 16–20. Results cover up to seven days of retained forecast history. Shading shows error variation, not confidence in the mean.

API quality

Loading feed audit…
Availability of selected feed features, wheelchair information and unusual forecasts.
How this is calculated

Features and accessibility. The score counts four selected capabilities observed in the supplied feeds, not coverage of the full GTFS specification or every service. Wheelchair fields describe published information, not an accessibility audit; blank or 0 means unknown.

GPS coverage. Distinct local trip IDs with reported GPS are divided by IDs seen in trip updates or reported positions in the latest three minutes. Upcoming services can be included, so this is not the share of the fleet with GPS.

Missing shapes. A trip needs a referenced shapes.txt entry with at least two points. A route is missing shapes when none of its trips has a usable shape; partly shaped routes are listed separately. Counts cover the named archive and exclude supplemental map geometry.

Unusual forecasts. Only the latest value per trip-stop is retained, so repeated snapshots do not multiply counts. Delays beyond six hours are flagged, not proven false. Unreadable responses count failed parser attempts. Realtime checks cover seven days.

References: GTFS Schedule ↗ and GTFS Realtime ↗. The Swiss platform documents missing official shapes ↗ and no published vehicle-position feed ↗.