Source code for aequilibrae.transit.route_system_reader.stop_times_reader

import sqlite3

import pandas as pd
from aequilibrae.utils.get_table import get_table

# from polarislib.network.data import DataTableStorage


[docs] def read_stop_times(conn: sqlite3.Connection): tpm = get_table("Transit_Pattern_Links", conn) tts = get_table("Transit_Trips_Schedule", conn).reset_index() tl = get_table("Transit_Links", conn).reset_index() trps = pd.read_sql("select pattern_id, trip_id from Transit_Trips", conn) tl.drop(columns=["pattern_id", "length", "geo", "type"], inplace=True) trip_stops = tts.merge(trps, on="trip_id") links = tpm.merge(tl, on="transit_link") first_nodes = links[["pattern_id", "from_node", "index"]].rename(columns={"from_node": "stop_id"}) last_nodes = links.sort_values("index", ascending=False).drop_duplicates(subset=["pattern_id"], keep="first") last_nodes = last_nodes[["pattern_id", "to_node", "index"]].rename(columns={"to_node": "stop_id"}) last_nodes.loc[:, "index"] += 1 links = pd.concat([first_nodes, last_nodes], ignore_index=True).set_index(["pattern_id", "index"]) stop_times = trip_stops.set_index(["pattern_id", "index"]).join(links).reset_index() renames = {"index": "stop_sequence", "departure": "departure_time", "arrival": "arrival_time"} stop_times.rename(columns=renames, inplace=True) # Conversion must be convoluted to support def pad(k: pd.Series) -> pd.Series: return k.astype(str).str.pad(width=2, side="left", fillchar="0") for field in ["departure_time", "arrival_time"]: h = pad(stop_times[field] // 3600) s = stop_times[field] % 3600 m = pad(s // 60) s = pad(s % 60) stop_times[field] = h + ":" + m + ":" + s stop_times.loc[:, "stop_sequence"] += 1 stop_times.stop_id = stop_times.stop_id.astype(str) return stop_times.sort_values(["trip_id", "stop_sequence"], ascending=True)