1+ # ' Filter a `stop_times` table for a given date and timespan.
2+ # '
3+ # ' @param gtfs_obj gtfs feed (tidygtfs object)
4+ # ' @param extract_date date to extract trips from this day (Date or "YYYY-MM-DD" string)
5+ # ' @param min_departure_time (optional) The earliest departure time. Can be given as "HH:MM:SS",
6+ # ' hms object or numeric value in seconds.
7+ # ' @param max_arrival_time (optional) The latest arrival time. Can be given as "HH:MM:SS",
8+ # ' hms object or numeric value in seconds.
9+ # '
10+ # ' @return Filtered `stop_times` data.table for [travel_times()] and [raptor()].
11+ # '
12+ # ' @export
13+ # ' @examples
14+ # ' feed_path <- system.file("extdata", "routing.zip", package = "tidytransit")
15+ # ' g <- read_gtfs(feed_path)
16+ # '
17+ # ' # filter the sample feed
18+ # ' stop_times <- filter_stop_times(g, "2018-10-01", "06:00:00", "08:00:00")
19+ filter_stop_times = function (gtfs_obj ,
20+ extract_date ,
21+ min_departure_time ,
22+ max_arrival_time ) {
23+ if (! feed_has_non_empty_table(gtfs_obj , " stop_times" )) {
24+ stop(" `gtfs_obj` has no `stop_times`" )
25+ }
26+ # check feasibility for routing
27+ assert_routable_feed(gtfs_obj )
28+ gtfs_obj $ stop_times <- replace_NA_times(gtfs_obj $ stop_times )
29+
30+ # check transfers
31+ if (feed_contains(gtfs_obj , " transfers" )) {
32+ transfers <- gtfs_obj [[" transfers" ]]
33+ } else {
34+ warning(" No transfers found in feed, travel_times() or raptor() might produce unexpected results" )
35+ transfers <- data.frame ()
36+ }
37+
38+ # trim min/max times
39+ departure_time_num <- arrival_time_num <- NULL
40+ if (is.character(extract_date )) {
41+ extract_date <- as.Date(extract_date )
42+ }
43+ if (missing(min_departure_time )) {
44+ min_departure_time <- 0
45+ } else if (is.character(min_departure_time )) {
46+ min_departure_time <- hhmmss_to_seconds(min_departure_time )
47+ }
48+ if (missing(max_arrival_time )) {
49+ max_arrival_time <- max(gtfs_obj $ stop_times $ arrival_time , na.rm = TRUE )+ 1
50+ } else if (is.character(max_arrival_time )) {
51+ max_arrival_time <- hhmmss_to_seconds(max_arrival_time )
52+ }
53+ min_departure_time <- as.numeric(min_departure_time )
54+ max_arrival_time <- as.numeric(max_arrival_time )
55+
56+ if (max_arrival_time < = min_departure_time ) {
57+ stop(" `max_arrival_time` is before `min_departure_time`" , call. = FALSE )
58+ }
59+
60+ # trips running on day
61+ service_ids = filter(gtfs_obj $ . $ dates_services , date == extract_date )
62+ if (nrow(service_ids ) == 0 ) {
63+ stop(" No stop_times on " , extract_date )
64+ }
65+ trips = inner_join(gtfs_obj $ trips , service_ids , by = " service_id" )
66+ trips = as.data.table(unique(trips [,c(" trip_id" )]))
67+
68+ # prepare stop_times
69+ stop_times_dt = as.data.table(gtfs_obj $ stop_times )
70+ stop_times_dt <- stop_times_dt [trips , on = " trip_id" ]
71+ set_num_times(stop_times_dt )
72+ stop_times_dt <- stop_times_dt [departure_time_num > = min_departure_time &
73+ arrival_time_num < = max_arrival_time ,]
74+ setindex(stop_times_dt , " stop_id" )
75+ if (nrow(stop_times_dt ) == 0 ) {
76+ stop(" No stop times between `min_departure_time` and `max_arrival_time`" , call. = FALSE )
77+ }
78+
79+ # store stops and transfers in attributes
80+ attributes(stop_times_dt )$ stops <- stops_as_dt(gtfs_obj $ stops )
81+ attributes(stop_times_dt )$ transfers <- transfers
82+ attributes(stop_times_dt )$ extract_date <- extract_date
83+ attributes(stop_times_dt )$ min_departure_time <- min_departure_time
84+ attributes(stop_times_dt )$ max_arrival_time <- max_arrival_time
85+
86+ return (stop_times_dt )
87+ }
0 commit comments