Planned industrial action from Thursday 25th of January - now suspended

Due to planned industrial action, Sydney metropolitan, NSW Intercity & Regional train services may be disrupted from Thursday 25th of January.

If you have a customer facing public transport product or app and you are not using the TfNSW service alerts feed with custom alerts we are currently requesting that the following message is displayed to customers:

“Due to planned industrial action, Metropolitan, Intercity and Regional Train Services may be disrupted from Thursday 25th January. If you must travel expect delays, travel outside the peak and allow plenty of extra travel time. For the latest information go to”

If you have any questions about this feel free to ask in this thread.


Will the GTFS timetable be updated, or will the changes be done through real time?

If it will be updated, when will it be?


yes it should have been updated overnight.

We can officially confirm that industrial action is going ahead on Monday 29th of January and reduced services will run from Thursday 25th of January. The following message is will appear in the alerts feed:

“On Monday 29 January all stations will be closed and no trains will run across NSW. Reduced services will run from Thursday 25 on Metropolitan, Intercity and Regional Trains. For the latest information go to”

Train data for Monday 29th has been pulled from the trip planner (Trip Planner API). If you need the Sydney Trains and NSW Trains GTFS bundles with the Monday data manually removed have a look at this dataset User account | TfNSW Open Data Hub and Developer Portal


Dataset has been updated with the GTFS bundles for today (25/01).

In looking at the bundles, I find that the number of distinct tripIDs (e.g. 1–A
… etc
is in excess of 6000 for both days (total of NSW and Sydney Trains trips). This conflicts somewhat with media releases stating that normally there would be 2900 trips and for Thursday, it would be 1600. The latter are also numbers that come out of the Train Rosters database

Am I multiple counting somehow or is there a way of filtering out trip_IDs that really are NOT running today

Geoff Lambert

Industrial action has been suspended. Expect ongoing disruptions as train services return to normal. For the latest information go to

1 Like

OK - I’ve partially got it: Filter for Thursday, then Filter out empty trains

Number of trips still a bit big, probably due to inclusion of trips for entire Greater Sydney e.g. beyond Gosford? Also NSWtrains connecting buses?

Speaking on a personal capacity here. I haven’t gone in and confirmed the data myself… but if I were to take a stab based on what the data is Sydney Trains GTFS bundle is normally like, I’d say it’s to do with the differing definition of a “trip”.

The GTFS data breaks each individual train run as a trip. But a train run doesn’t always fit neatly to what commuters expect the definition of a “trip” is.

As an example, a commuter might consider a T3 Lidcombe to City via Bankstown service as one train trip – but it’s broken into at least two “trips” in the GTFS data: Lidcombe to Regents Park, then Birrong to Central.

Similarly, a T1 Emu Plains to Hornsby service is broken into two runs – separated at Central. For commuters, this might be considered one “train trip”.

Services that start or end at Redfern or Central and go via the City Circle may have a run specific to going around the circle.

So… yeah, it’s probably not as simple as doing a quick filter and counting the number of rows.

Hello jxeeno

Thanks for this.

TfNSW produce a series of PDF timetable documents – Working Timetable, Starts and Stables, and Train Rosters for Sydney and NSW trains for weekdays and weekends (thus 12 documents in all). Train Rosters give a physical representation to how each “Run” is broken up into “Trips” via a “zig-zag diagram”- the Train Duty Report. Rosters also have an index of trip numbers. All of these, plus, I think, crew rosters derive from a Master Database. Runs switch Trip IDs at turnback points or at Circular Quay.

What I was trying to do yesterday was to extract the trip numbers (left-most 4-characters of the Trip_ID) and match it up with the Roster indexes to see if what was being run was essentially a Saturday timetable and also to verify that the numbers given by TfNSW (2900 cut by 1300 to 1600) were what was really happening. The latter depended on filtering a lot of stuff out and, in the end, worked fairly well. Number of trips can also be found in the Annual Sydney Trains traffic Compendium. The numbers quoted in the media were probably only ball-park figures anyway

Big mystery is how Sydney Trains can work up the bundle from scratch on the basis of adjusting the crew roster to eliminate overtime. That seems to depend on an Optimisation model, which is a very intensive NP-Hard problem. I suspect that they had at least the rudiments of it up their sleeve as part of planning anyway.

PS – I like very much. Was watching it yesterday. Used it a lot last year to do delay statistics for NT32 Brisbane Sydney XPT