Driving

Some other relations to use are: * expo_line_west: 2351006 * blue_line_north: 2351005 * c_line_east: 2377889 * s1_ost_flug: 1773071 * bart_red_south: 2851509 * caltrain_local: 2768041 * san_bernardino_line: 1287719 * orange_county_line: 2812899 * ca_hsr: 7739486

If using BART, set gague = 1.676 * meter when creating the Route.

[1]:
# Maybe Network is just a Route with a MultiIndex
[2]:
from pandas import isna

from dpd.driving import Route

relation = 1287719  # san_bernardino_line
route = Route.from_osm_relation(relation=relation)

for name in [
    "San Bernardino–Downtown",
    "Rialto",
    "Fontana",
    "Upland",
    "Claremont",
    "Pomona–North",
    "Baldwin Park",
    "El Monte",
]:
    route.remove_stop(name)

route.drop([0, 1, 2], inplace=True)
route["type"] = route["name"].map(lambda x: "node" if isna(x) else "stop")
route["dwell_time"] = route["type"].map(lambda x: 45 if x == "stop" else None)
route["distance_to_point"] = route.distance_to_point
route.stops
[2]:
geometry name type dwell_time distance_to_point
3 POINT (-13044783.927 3791434.500) Redlands–Downtown stop 45.0 0.0 m
274 POINT (-13058824.020 3796486.357) San Bernardino Depot stop 45.0 16655.95377891604 m
489 POINT (-13086585.643 3795095.687) Rancho Cucamonga stop 45.0 44616.30247282995 m
602 POINT (-13101712.414 3795316.021) Montclair stop 45.0 59766.89984536552 m
785 POINT (-13123235.081 3795111.238) Covina stop 45.0 81557.81338859064 m
1093 POINT (-13154418.241 3791838.044) Cal State LA stop 45.0 116007.39146111836 m
1312 POINT (-13161791.276 3790912.334) Los Angeles Union Station stop 45.0 124635.87800640527 m
[3]:
from folium import Map

map_ = Map(location=[34, -117.75], zoom_start=10)

route.geometry.explore(m=map_)
route.stops.geometry.explore(m=map_, color="black", marker_kwds={"radius": 20})
[3]:
Make this Notebook Trusted to load map: File -> Trust Notebook
[4]:
from dpd.driving import Vehicles

vehicles = Vehicles(
    url="https://raw.githubusercontent.com/davidbailey/Notes/trunk/Trains.csv",
    vehicle="Stadler KISS",
)
[5]:
from uuid import uuid4

from astropy.constants import g0
from astropy.units import meter, second

from dpd.driving import EdgesLanesNodesDriver
from dpd.driving.datacollection import DYNAMIC_BODY_DRIVER_REPORTERS
from dpd.mapping.edges import object_for_edge
from dpd.mapping.nodes import NodeModel
from dpd.modeling import TransportationModel

mu = 0.25  # https://railroads.dot.gov/sites/fra.dot.gov/files/fra_net/17468/A%20Survey%20of%20Wheel-Rail%20Friction.pdf

node_model = NodeModel(velocity_unit=meter / second)

edges = route.edges
edges["object"] = edges.apply(object_for_edge, axis=1)
route["object"] = route.apply(node_model.object_for_node, axis=1)

body_model = TransportationModel(
    time_unit=second / 1,
    agent_reporters=DYNAMIC_BODY_DRIVER_REPORTERS | {"geometry": "geometry"},
)

vehicle = vehicles.vehicle(
    initial_acceleration=mu * g0,
    max_acceleration=mu * g0,
    max_deceleration=1 * meter / second**2,
    initial_position=0 * meter,
    initial_velocity=0 * meter / second,
    unique_id=uuid4(),
    model=body_model,
)

driver = EdgesLanesNodesDriver.from_node_ids(
    edges_dict=edges.T,
    nodes_dict=route.T,
    node_ids=route.index,
    body=vehicle,
    driver_final_velocity=0 * meter / second,
    driver_max_velocity=vehicle.max_velocity,
    unique_id=uuid4(),
    model=body_model,
)

body_model.schedule.add(driver)

while body_model.running:
    body_model.step()
    node_model.step()

# run the data collector one more time because we never get the final data point
body_model.schedule.add(driver)
body_model.datacollector.collect(body_model)
/home/docs/checkouts/readthedocs.org/user_builds/dpd/envs/latest/lib/python3.9/site-packages/astropy/units/quantity.py:671: RuntimeWarning: divide by zero encountered in divide
  result = super().__array_ufunc__(function, method, *arrays, **kwargs)
[6]:
"""
Add to beginning of edges in the driver to get geometry to work.
"""

from shapely.geometry import LineString, Point

LineString([Point(0, 0), Point(0, 0)]).interpolate(0)
[6]:
../_images/notebooks_driving_7_0.svg
[7]:
from pandas import merge

df = body_model.get_dataframe()
df = merge(
    df,
    route.stops[["name", "distance_to_point"]],
    left_on="position",
    right_on="distance_to_point",
    how="left",
).set_index(df.index)
df
[7]:
position velocity acceleration geometry time name distance_to_point
Step AgentID
0 4159f0a7-2769-4332-a40d-97c438b795e4 0.0 m 0.0 m / s 2.4516625 m / s2 None 0.0 s Redlands–Downtown 0.0 m
1 4159f0a7-2769-4332-a40d-97c438b795e4 0.0 m 0.0 m / s 2.4516625 m / s2 None 1.0 s Redlands–Downtown 0.0 m
2 4159f0a7-2769-4332-a40d-97c438b795e4 0.0 m 0.0 m / s 2.4516625 m / s2 None 2.0 s Redlands–Downtown 0.0 m
3 4159f0a7-2769-4332-a40d-97c438b795e4 0.0 m 0.0 m / s 2.4516625 m / s2 None 3.0 s Redlands–Downtown 0.0 m
4 4159f0a7-2769-4332-a40d-97c438b795e4 0.0 m 0.0 m / s 2.4516625 m / s2 None 4.0 s Redlands–Downtown 0.0 m
... ... ... ... ... ... ... ... ...
4376 4159f0a7-2769-4332-a40d-97c438b795e4 124635.87800640527 m 1.7794783459398131 m / s -1.0 m / s2 POINT (-13044783.927377628 3791434.499901977) 4376.0 s Los Angeles Union Station 124635.87800640527 m
4377 4159f0a7-2769-4332-a40d-97c438b795e4 124635.87800640527 m 1.7794783459398131 m / s -1.0 m / s2 POINT (-13044783.927377628 3791434.499901977) 4377.0 s Los Angeles Union Station 124635.87800640527 m
4378 4159f0a7-2769-4332-a40d-97c438b795e4 124635.87800640527 m 1.7794783459398131 m / s -1.0 m / s2 POINT (-13044783.927377628 3791434.499901977) 4378.0 s Los Angeles Union Station 124635.87800640527 m
4379 4159f0a7-2769-4332-a40d-97c438b795e4 124635.87800640527 m 1.7794783459398131 m / s -1.0 m / s2 POINT (-13044783.927377628 3791434.499901977) 4379.0 s Los Angeles Union Station 124635.87800640527 m
4381 4159f0a7-2769-4332-a40d-97c438b795e4 124635.87800640527 m 1.7794783459398131 m / s -1.0 m / s2 POINT (-13044783.927377628 3791434.499901977) 4381.0 s Los Angeles Union Station 124635.87800640527 m

4381 rows × 7 columns

[8]:
# Redo Trip to support MultiIndex and multiple Trips, Trip
[9]:
from matplotlib import pyplot as plt

from dpd.driving import Trip

trip = Trip.from_model(df, route)
fig = plt.figure(figsize=(18, 16))
ax = fig.add_subplot(111)
trip.plot_schedule(ax=ax)
trip.stops
[9]:
timedelta name total_time total_distance geometry
Stop Arriva/Departure
Redlands–Downtown Arrival 0 days 00:00:00 Redlands–Downtown 0.0 s 0.0 m POINT (-13044783.927 3791434.500)
Departure 0 days 00:00:45 Redlands–Downtown 45.0 s 0.0 m POINT (-13044783.927 3791434.500)
San Bernardino Depot Arrival 0 days 00:12:15 San Bernardino Depot 735.0 s 16655.95377891604 m POINT (-13058824.020 3796486.357)
Departure 0 days 00:12:59 San Bernardino Depot 779.0 s 16655.95377891604 m POINT (-13058824.020 3796486.357)
Rancho Cucamonga Arrival 0 days 00:26:36 Rancho Cucamonga 1596.0 s 44616.30247282995 m POINT (-13086585.643 3795095.687)
Departure 0 days 00:27:20 Rancho Cucamonga 1640.0 s 44616.30247282995 m POINT (-13086585.643 3795095.687)
Montclair Arrival 0 days 00:34:46 Montclair 2086.0 s 59766.89984536552 m POINT (-13101712.414 3795316.021)
Departure 0 days 00:35:30 Montclair 2130.0 s 59766.89984536552 m POINT (-13101712.414 3795316.021)
Covina Arrival 0 days 00:46:23 Covina 2783.0 s 81557.81338859064 m POINT (-13123235.081 3795111.238)
Departure 0 days 00:47:07 Covina 2827.0 s 81557.81338859064 m POINT (-13123235.081 3795111.238)
Cal State LA Arrival 0 days 01:04:32 Cal State LA 3872.0 s 116007.39146111836 m POINT (-13154418.241 3791838.044)
Departure 0 days 01:05:16 Cal State LA 3916.0 s 116007.39146111836 m POINT (-13154418.241 3791838.044)
Los Angeles Union Station Arrival 0 days 01:12:16 Los Angeles Union Station 4336.0 s 124635.87800640527 m POINT (-13161791.276 3790912.334)
Departure 0 days 01:13:01 Los Angeles Union Station 4381.0 s 124635.87800640527 m POINT (-13161791.276 3790912.334)
../_images/notebooks_driving_10_1.png
[10]:
from datetime import datetime

trip.index = trip.index + datetime(year=1970, month=1, day=1)
trip["distance"] = trip["total_distance"].map(lambda x: x.value)
trajectory = trip.to_trajectory(index=0)
trajectory
[10]:
Trajectory 0 (1970-01-01 00:00:00 to 1970-01-01 01:13:01) | Size: 4381 | Length: 124635.9m
Bounds: (-13161791.276421035, 3790465.5527902134, -13044783.927377628, 3796554.127811356)
LINESTRING (-13044783.927377628 3791434.499901977, -13044783.927377628 3791434.499901977, -13044783.
[11]:
from astropy.units import m, s
from pandas import Series

trajectory.add_speed(overwrite=True)
speed = trajectory.df["speed"]
speed.index = df.position
speed.index = speed.index.map(lambda x: x.value)

speed_limits = Series(
    map(lambda x: x.value, route.speed_limits), index=route.distance_to_point[:-1]
)
speed_limits.index.name = "position"
speed_limits.index = speed_limits.index.map(lambda x: x.value)

fig = plt.figure(figsize=(18, 16))
ax = fig.add_subplot(111)
speed.plot(ax=ax)
speed_limits.plot(ax=ax)
ax.set_ylim([0, 50])
plt.show()
../_images/notebooks_driving_12_0.png
[12]:
from dpd.driving import Schedule

schedule = Schedule.from_trip(trip)

schedule.schedule[schedule.schedule.index.isin(["Departure"], level=1)].applymap(
    lambda x: x.round("s")
)
/tmp/ipykernel_2767/1069224915.py:5: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
  schedule.schedule[schedule.schedule.index.isin(["Departure"], level=1)].applymap(
[12]:
0 1 2 3 4 5 6 7 8 9 ... 45 46 47 48 49 50 51 52 53 54
Stop Arriva/Departure
Redlands–Downtown Departure 1970-01-01 06:00:45 1970-01-01 06:20:45 1970-01-01 06:40:45 1970-01-01 07:00:45 1970-01-01 07:20:45 1970-01-01 07:40:45 1970-01-01 08:00:45 1970-01-01 08:20:45 1970-01-01 08:40:45 1970-01-01 09:00:45 ... 1970-01-01 21:00:45 1970-01-01 21:20:45 1970-01-01 21:40:45 1970-01-01 22:00:45 1970-01-01 22:20:45 1970-01-01 22:40:45 1970-01-01 23:00:45 1970-01-01 23:20:45 1970-01-01 23:40:45 1970-01-02 00:00:45
San Bernardino Depot Departure 1970-01-01 06:12:59 1970-01-01 06:32:59 1970-01-01 06:52:59 1970-01-01 07:12:59 1970-01-01 07:32:59 1970-01-01 07:52:59 1970-01-01 08:12:59 1970-01-01 08:32:59 1970-01-01 08:52:59 1970-01-01 09:12:59 ... 1970-01-01 21:12:59 1970-01-01 21:32:59 1970-01-01 21:52:59 1970-01-01 22:12:59 1970-01-01 22:32:59 1970-01-01 22:52:59 1970-01-01 23:12:59 1970-01-01 23:32:59 1970-01-01 23:52:59 1970-01-02 00:12:59
Rancho Cucamonga Departure 1970-01-01 06:27:20 1970-01-01 06:47:20 1970-01-01 07:07:20 1970-01-01 07:27:20 1970-01-01 07:47:20 1970-01-01 08:07:20 1970-01-01 08:27:20 1970-01-01 08:47:20 1970-01-01 09:07:20 1970-01-01 09:27:20 ... 1970-01-01 21:27:20 1970-01-01 21:47:20 1970-01-01 22:07:20 1970-01-01 22:27:20 1970-01-01 22:47:20 1970-01-01 23:07:20 1970-01-01 23:27:20 1970-01-01 23:47:20 1970-01-02 00:07:20 1970-01-02 00:27:20
Montclair Departure 1970-01-01 06:35:30 1970-01-01 06:55:30 1970-01-01 07:15:30 1970-01-01 07:35:30 1970-01-01 07:55:30 1970-01-01 08:15:30 1970-01-01 08:35:30 1970-01-01 08:55:30 1970-01-01 09:15:30 1970-01-01 09:35:30 ... 1970-01-01 21:35:30 1970-01-01 21:55:30 1970-01-01 22:15:30 1970-01-01 22:35:30 1970-01-01 22:55:30 1970-01-01 23:15:30 1970-01-01 23:35:30 1970-01-01 23:55:30 1970-01-02 00:15:30 1970-01-02 00:35:30
Covina Departure 1970-01-01 06:47:07 1970-01-01 07:07:07 1970-01-01 07:27:07 1970-01-01 07:47:07 1970-01-01 08:07:07 1970-01-01 08:27:07 1970-01-01 08:47:07 1970-01-01 09:07:07 1970-01-01 09:27:07 1970-01-01 09:47:07 ... 1970-01-01 21:47:07 1970-01-01 22:07:07 1970-01-01 22:27:07 1970-01-01 22:47:07 1970-01-01 23:07:07 1970-01-01 23:27:07 1970-01-01 23:47:07 1970-01-02 00:07:07 1970-01-02 00:27:07 1970-01-02 00:47:07
Cal State LA Departure 1970-01-01 07:05:16 1970-01-01 07:25:16 1970-01-01 07:45:16 1970-01-01 08:05:16 1970-01-01 08:25:16 1970-01-01 08:45:16 1970-01-01 09:05:16 1970-01-01 09:25:16 1970-01-01 09:45:16 1970-01-01 10:05:16 ... 1970-01-01 22:05:16 1970-01-01 22:25:16 1970-01-01 22:45:16 1970-01-01 23:05:16 1970-01-01 23:25:16 1970-01-01 23:45:16 1970-01-02 00:05:16 1970-01-02 00:25:16 1970-01-02 00:45:16 1970-01-02 01:05:16
Los Angeles Union Station Departure 1970-01-01 07:13:01 1970-01-01 07:33:01 1970-01-01 07:53:01 1970-01-01 08:13:01 1970-01-01 08:33:01 1970-01-01 08:53:01 1970-01-01 09:13:01 1970-01-01 09:33:01 1970-01-01 09:53:01 1970-01-01 10:13:01 ... 1970-01-01 22:13:01 1970-01-01 22:33:01 1970-01-01 22:53:01 1970-01-01 23:13:01 1970-01-01 23:33:01 1970-01-01 23:53:01 1970-01-02 00:13:01 1970-01-02 00:33:01 1970-01-02 00:53:01 1970-01-02 01:13:01

7 rows × 55 columns

[13]:
from numpy import concatenate

route_reversed = Route(route.reversed[["geometry", "name", "object"]].copy())
route_reversed["distance_to_point"] = route_reversed.distance_to_point
route_reversed.stops
[13]:
geometry name object distance_to_point
0 POINT (-13161791.276 3790912.334) Los Angeles Union Station <dpd.mapping.nodes.stop.Stop object at 0x7f137... 0.0 m
219 POINT (-13154418.241 3791838.044) Cal State LA <dpd.mapping.nodes.stop.Stop object at 0x7f137... 8628.48654528681 m
527 POINT (-13123235.081 3795111.238) Covina <dpd.mapping.nodes.stop.Stop object at 0x7f137... 43078.06461781463 m
710 POINT (-13101712.414 3795316.021) Montclair <dpd.mapping.nodes.stop.Stop object at 0x7f137... 64868.978161039704 m
823 POINT (-13086585.643 3795095.687) Rancho Cucamonga <dpd.mapping.nodes.stop.Stop object at 0x7f137... 80019.57553357532 m
1038 POINT (-13058824.020 3796486.357) San Bernardino Depot <dpd.mapping.nodes.stop.Stop object at 0x7f137... 107979.92422748917 m
1309 POINT (-13044783.927 3791434.500) Redlands–Downtown <dpd.mapping.nodes.stop.Stop object at 0x7f138... 124635.8780064052 m
[14]:
edges = route_reversed.edges
edges["object"] = edges.apply(object_for_edge, axis=1)

body_model = TransportationModel(
    time_unit=second / 1, agent_reporters=DYNAMIC_BODY_DRIVER_REPORTERS
)

vehicle = vehicles.vehicle(
    initial_acceleration=mu * g0,
    max_acceleration=mu * g0,
    max_deceleration=1 * meter / second**2,
    initial_position=0 * meter,
    initial_velocity=0 * meter / second,
    unique_id=uuid4(),
    model=body_model,
)

driver = EdgesLanesNodesDriver.from_node_ids(
    edges_dict=edges.T,
    nodes_dict=route_reversed.T,
    node_ids=route_reversed.index,
    body=vehicle,
    driver_final_velocity=0 * meter / second,
    driver_max_velocity=vehicle.max_velocity,
    unique_id=uuid4(),
    model=body_model,
)

body_model.schedule.add(driver)

while body_model.running:
    body_model.step()
    node_model.step()

# run the data collector one more time because we never get the final data point
body_model.schedule.add(driver)
body_model.datacollector.collect(body_model)
/home/docs/checkouts/readthedocs.org/user_builds/dpd/envs/latest/lib/python3.9/site-packages/astropy/units/quantity.py:671: RuntimeWarning: divide by zero encountered in divide
  result = super().__array_ufunc__(function, method, *arrays, **kwargs)
[15]:
df = body_model.get_dataframe()
df = merge(
    df,
    route_reversed.stops[["name", "distance_to_point"]],
    left_on="position",
    right_on="distance_to_point",
    how="left",
).set_index(df.index)

trip_reversed = Trip.from_model(df, route, include_geometry=False)
trip_reversed.index = trip_reversed.index + datetime(year=1970, month=1, day=1)

schedule_reversed = Schedule.from_trip(trip_reversed)
schedule_reversed.reverse_distance()
[16]:
fig = plt.figure(figsize=(18, 16))
ax = fig.add_subplot(111)
schedule.plot_schedule(ax=ax)
schedule_reversed.plot_schedule(ax=ax)
schedule.trips[list(schedule.trips.keys())[0]].plot_schedule(ax=ax)  # to add labels
plt.show()
../_images/notebooks_driving_17_0.png
[17]:
import gtfs_kit

feed = gtfs_kit.read_feed(
    "http://www.bart.gov/dev/schedules/google_transit.zip", dist_units="mi"
)

trip = Trip.from_gtfs(feed, trip_id="1508825")
from astropy import units

units.imperial.enable()
trip["total_distance"] = trip.total_distance.map(
    lambda x: (x.value * units.imperial.foot).to(units.meter)
)
[18]:
from matplotlib import pyplot as plt

fig = plt.figure(figsize=(18, 16))
ax = fig.add_subplot(111)
trip.plot_schedule(ax=ax)
plt.show()
../_images/notebooks_driving_19_0.png
[19]:
from dpd.driving import Schedule

schedule = Schedule.from_gtfs(feed, route_id="6", direction_id=0)
schedule_reversed = Schedule.from_gtfs(feed, route_id="5", direction_id=1)
[20]:
from astropy import units

units.imperial.enable()
for trip_id in schedule.trips:
    trip = schedule.trips[trip_id]
    trip["total_distance"] = trip.total_distance.map(
        lambda x: (x.value * units.imperial.foot).to(units.meter)
    )
for trip_id in schedule_reversed.trips:
    trip = schedule_reversed.trips[trip_id]
    trip["total_distance"] = trip.total_distance.map(
        lambda x: (x.value * units.imperial.foot).to(units.meter)
    )
[21]:
schedule_reversed.reverse_distance()
[22]:
from matplotlib import pyplot as plt

fig = plt.figure(figsize=(18, 16))
ax = fig.add_subplot(111)
schedule.plot_schedule(ax=ax)
schedule.trips[list(schedule.trips.keys())[-1]].plot_schedule(ax=ax)  # to add labels
schedule_reversed.plot_schedule(ax=ax)
plt.show()
../_images/notebooks_driving_23_0.png
[23]:
schedule_reversed.schedule
[23]:
1508825 1508819 1508824 1508777 1508778 1508779 1508780 1508781 1508782 1508783 ... 1531530 1531531 1531532 1531533 1531534 1531535 1531536 1531537 1531538 1531539
Stop Arriva/Departure
South Hayward Arrival 0 days 04:37:00 0 days 05:17:00 0 days 04:57:00 0 days 05:37:00 0 days 05:57:00 0 days 06:17:00 0 days 06:37:00 0 days 06:57:00 0 days 07:17:00 0 days 07:37:00 ... 0 days 16:17:00 0 days 16:37:00 0 days 16:57:00 0 days 17:17:00 0 days 17:37:00 0 days 17:57:00 0 days 18:17:00 0 days 18:37:00 0 days 18:57:00 0 days 19:17:00
Departure 0 days 04:37:00 0 days 05:17:00 0 days 04:57:00 0 days 05:37:00 0 days 05:57:00 0 days 06:17:00 0 days 06:37:00 0 days 06:57:00 0 days 07:17:00 0 days 07:37:00 ... 0 days 16:17:00 0 days 16:37:00 0 days 16:57:00 0 days 17:17:00 0 days 17:37:00 0 days 17:57:00 0 days 18:17:00 0 days 18:37:00 0 days 18:57:00 0 days 19:17:00
Hayward Arrival 0 days 04:41:00 0 days 05:21:00 0 days 05:01:00 0 days 05:41:00 0 days 06:01:00 0 days 06:21:00 0 days 06:41:00 0 days 07:01:00 0 days 07:21:00 0 days 07:41:00 ... 0 days 16:21:00 0 days 16:41:00 0 days 17:01:00 0 days 17:21:00 0 days 17:41:00 0 days 18:01:00 0 days 18:21:00 0 days 18:41:00 0 days 19:01:00 0 days 19:21:00
Departure 0 days 04:41:00 0 days 05:21:00 0 days 05:01:00 0 days 05:41:00 0 days 06:01:00 0 days 06:21:00 0 days 06:41:00 0 days 07:01:00 0 days 07:21:00 0 days 07:41:00 ... 0 days 16:21:00 0 days 16:41:00 0 days 17:01:00 0 days 17:21:00 0 days 17:41:00 0 days 18:01:00 0 days 18:21:00 0 days 18:41:00 0 days 19:01:00 0 days 19:21:00
Bay Fair Arrival 0 days 04:45:00 0 days 05:25:00 0 days 05:05:00 0 days 05:45:00 0 days 06:05:00 0 days 06:25:00 0 days 06:45:00 0 days 07:05:00 0 days 07:25:00 0 days 07:45:00 ... 0 days 16:25:00 0 days 16:45:00 0 days 17:05:00 0 days 17:25:00 0 days 17:45:00 0 days 18:05:00 0 days 18:25:00 0 days 18:45:00 0 days 19:05:00 0 days 19:25:00
Departure 0 days 04:45:00 0 days 05:25:00 0 days 05:05:00 0 days 05:45:00 0 days 06:05:00 0 days 06:25:00 0 days 06:45:00 0 days 07:05:00 0 days 07:25:00 0 days 07:45:00 ... 0 days 16:25:00 0 days 16:45:00 0 days 17:05:00 0 days 17:25:00 0 days 17:45:00 0 days 18:05:00 0 days 18:25:00 0 days 18:45:00 0 days 19:05:00 0 days 19:25:00
San Leandro Arrival 0 days 04:48:00 0 days 05:28:00 0 days 05:08:00 0 days 05:48:00 0 days 06:08:00 0 days 06:28:00 0 days 06:48:00 0 days 07:08:00 0 days 07:28:00 0 days 07:48:00 ... 0 days 16:28:00 0 days 16:48:00 0 days 17:08:00 0 days 17:28:00 0 days 17:48:00 0 days 18:08:00 0 days 18:28:00 0 days 18:48:00 0 days 19:08:00 0 days 19:28:00
Departure 0 days 04:49:00 0 days 05:29:00 0 days 05:09:00 0 days 05:49:00 0 days 06:09:00 0 days 06:29:00 0 days 06:49:00 0 days 07:09:00 0 days 07:29:00 0 days 07:49:00 ... 0 days 16:29:00 0 days 16:49:00 0 days 17:09:00 0 days 17:29:00 0 days 17:49:00 0 days 18:09:00 0 days 18:29:00 0 days 18:49:00 0 days 19:09:00 0 days 19:29:00
Coliseum Arrival 0 days 04:52:00 0 days 05:32:00 0 days 05:12:00 0 days 05:52:00 0 days 06:12:00 0 days 06:32:00 0 days 06:52:00 0 days 07:12:00 0 days 07:32:00 0 days 07:52:00 ... 0 days 16:32:00 0 days 16:52:00 0 days 17:12:00 0 days 17:32:00 0 days 17:52:00 0 days 18:12:00 0 days 18:32:00 0 days 18:52:00 0 days 19:12:00 0 days 19:32:00
Departure 0 days 04:53:00 0 days 05:33:00 0 days 05:13:00 0 days 05:53:00 0 days 06:13:00 0 days 06:33:00 0 days 06:53:00 0 days 07:13:00 0 days 07:33:00 0 days 07:53:00 ... 0 days 16:33:00 0 days 16:53:00 0 days 17:13:00 0 days 17:33:00 0 days 17:53:00 0 days 18:13:00 0 days 18:33:00 0 days 18:53:00 0 days 19:13:00 0 days 19:33:00
Fruitvale Arrival 0 days 04:56:00 0 days 05:36:00 0 days 05:16:00 0 days 05:56:00 0 days 06:16:00 0 days 06:36:00 0 days 06:56:00 0 days 07:16:00 0 days 07:36:00 0 days 07:56:00 ... 0 days 16:36:00 0 days 16:56:00 0 days 17:16:00 0 days 17:36:00 0 days 17:56:00 0 days 18:16:00 0 days 18:36:00 0 days 18:56:00 0 days 19:16:00 0 days 19:36:00
Departure 0 days 04:56:00 0 days 05:36:00 0 days 05:16:00 0 days 05:56:00 0 days 06:16:00 0 days 06:36:00 0 days 06:56:00 0 days 07:16:00 0 days 07:36:00 0 days 07:56:00 ... 0 days 16:36:00 0 days 16:56:00 0 days 17:16:00 0 days 17:36:00 0 days 17:56:00 0 days 18:16:00 0 days 18:36:00 0 days 18:56:00 0 days 19:16:00 0 days 19:36:00
Lake Merritt Arrival 0 days 05:00:00 0 days 05:40:00 0 days 05:20:00 0 days 06:00:00 0 days 06:20:00 0 days 06:40:00 0 days 07:00:00 0 days 07:20:00 0 days 07:40:00 0 days 08:00:00 ... 0 days 16:40:00 0 days 17:00:00 0 days 17:20:00 0 days 17:40:00 0 days 18:00:00 0 days 18:20:00 0 days 18:40:00 0 days 19:00:00 0 days 19:20:00 0 days 19:40:00
Departure 0 days 05:00:00 0 days 05:40:00 0 days 05:20:00 0 days 06:00:00 0 days 06:20:00 0 days 06:40:00 0 days 07:00:00 0 days 07:20:00 0 days 07:40:00 0 days 08:00:00 ... 0 days 16:40:00 0 days 17:00:00 0 days 17:20:00 0 days 17:40:00 0 days 18:00:00 0 days 18:20:00 0 days 18:40:00 0 days 19:00:00 0 days 19:20:00 0 days 19:40:00
West Oakland Arrival 0 days 05:05:00 0 days 05:45:00 0 days 05:25:00 0 days 06:05:00 0 days 06:25:00 0 days 06:45:00 0 days 07:05:00 0 days 07:25:00 0 days 07:45:00 0 days 08:05:00 ... 0 days 16:45:00 0 days 17:05:00 0 days 17:25:00 0 days 17:45:00 0 days 18:05:00 0 days 18:25:00 0 days 18:45:00 0 days 19:05:00 0 days 19:25:00 0 days 19:45:00
Departure 0 days 05:06:00 0 days 05:46:00 0 days 05:26:00 0 days 06:06:00 0 days 06:26:00 0 days 06:46:00 0 days 07:06:00 0 days 07:26:00 0 days 07:46:00 0 days 08:06:00 ... 0 days 16:46:00 0 days 17:06:00 0 days 17:26:00 0 days 17:46:00 0 days 18:06:00 0 days 18:26:00 0 days 18:46:00 0 days 19:06:00 0 days 19:26:00 0 days 19:46:00
Embarcadero Arrival 0 days 05:12:00 0 days 05:52:00 0 days 05:32:00 0 days 06:12:00 0 days 06:32:00 0 days 06:52:00 0 days 07:12:00 0 days 07:32:00 0 days 07:52:00 0 days 08:12:00 ... 0 days 16:52:00 0 days 17:12:00 0 days 17:32:00 0 days 17:52:00 0 days 18:12:00 0 days 18:32:00 0 days 18:52:00 0 days 19:12:00 0 days 19:32:00 0 days 19:52:00
Departure 0 days 05:13:00 0 days 05:53:00 0 days 05:33:00 0 days 06:13:00 0 days 06:33:00 0 days 06:53:00 0 days 07:13:00 0 days 07:33:00 0 days 07:53:00 0 days 08:13:00 ... 0 days 16:53:00 0 days 17:13:00 0 days 17:33:00 0 days 17:53:00 0 days 18:13:00 0 days 18:33:00 0 days 18:53:00 0 days 19:13:00 0 days 19:33:00 0 days 19:53:00
Montgomery Street Arrival 0 days 05:14:00 0 days 05:54:00 0 days 05:34:00 0 days 06:14:00 0 days 06:34:00 0 days 06:54:00 0 days 07:14:00 0 days 07:34:00 0 days 07:54:00 0 days 08:14:00 ... 0 days 16:54:00 0 days 17:14:00 0 days 17:34:00 0 days 17:54:00 0 days 18:14:00 0 days 18:34:00 0 days 18:54:00 0 days 19:14:00 0 days 19:34:00 0 days 19:54:00
Departure 0 days 05:14:00 0 days 05:54:00 0 days 05:34:00 0 days 06:14:00 0 days 06:34:00 0 days 06:54:00 0 days 07:14:00 0 days 07:34:00 0 days 07:54:00 0 days 08:14:00 ... 0 days 16:54:00 0 days 17:14:00 0 days 17:34:00 0 days 17:54:00 0 days 18:14:00 0 days 18:34:00 0 days 18:54:00 0 days 19:14:00 0 days 19:34:00 0 days 19:54:00
Powell Street Arrival 0 days 05:16:00 0 days 05:56:00 0 days 05:36:00 0 days 06:16:00 0 days 06:36:00 0 days 06:56:00 0 days 07:16:00 0 days 07:36:00 0 days 07:56:00 0 days 08:16:00 ... 0 days 16:56:00 0 days 17:16:00 0 days 17:36:00 0 days 17:56:00 0 days 18:16:00 0 days 18:36:00 0 days 18:56:00 0 days 19:16:00 0 days 19:36:00 0 days 19:56:00
Departure 0 days 05:16:00 0 days 05:56:00 0 days 05:36:00 0 days 06:16:00 0 days 06:36:00 0 days 06:56:00 0 days 07:16:00 0 days 07:36:00 0 days 07:56:00 0 days 08:16:00 ... 0 days 16:56:00 0 days 17:16:00 0 days 17:36:00 0 days 17:56:00 0 days 18:16:00 0 days 18:36:00 0 days 18:56:00 0 days 19:16:00 0 days 19:36:00 0 days 19:56:00
Civic Center / UN Plaza Arrival 0 days 05:17:00 0 days 05:57:00 0 days 05:37:00 0 days 06:17:00 0 days 06:37:00 0 days 06:57:00 0 days 07:17:00 0 days 07:37:00 0 days 07:57:00 0 days 08:17:00 ... 0 days 16:57:00 0 days 17:17:00 0 days 17:37:00 0 days 17:57:00 0 days 18:17:00 0 days 18:37:00 0 days 18:57:00 0 days 19:17:00 0 days 19:37:00 0 days 19:57:00
Departure 0 days 05:18:00 0 days 05:58:00 0 days 05:38:00 0 days 06:18:00 0 days 06:38:00 0 days 06:58:00 0 days 07:18:00 0 days 07:38:00 0 days 07:58:00 0 days 08:18:00 ... 0 days 16:58:00 0 days 17:18:00 0 days 17:38:00 0 days 17:58:00 0 days 18:18:00 0 days 18:38:00 0 days 18:58:00 0 days 19:18:00 0 days 19:38:00 0 days 19:58:00
16th Street / Mission Arrival 0 days 05:20:00 0 days 06:00:00 0 days 05:40:00 0 days 06:20:00 0 days 06:40:00 0 days 07:00:00 0 days 07:20:00 0 days 07:40:00 0 days 08:00:00 0 days 08:20:00 ... 0 days 17:00:00 0 days 17:20:00 0 days 17:40:00 0 days 18:00:00 0 days 18:20:00 0 days 18:40:00 0 days 19:00:00 0 days 19:20:00 0 days 19:40:00 0 days 20:00:00
Departure 0 days 05:20:00 0 days 06:00:00 0 days 05:40:00 0 days 06:20:00 0 days 06:40:00 0 days 07:00:00 0 days 07:20:00 0 days 07:40:00 0 days 08:00:00 0 days 08:20:00 ... 0 days 17:00:00 0 days 17:20:00 0 days 17:40:00 0 days 18:00:00 0 days 18:20:00 0 days 18:40:00 0 days 19:00:00 0 days 19:20:00 0 days 19:40:00 0 days 20:00:00
24th Street / Mission Arrival 0 days 05:22:00 0 days 06:02:00 0 days 05:42:00 0 days 06:22:00 0 days 06:42:00 0 days 07:02:00 0 days 07:22:00 0 days 07:42:00 0 days 08:02:00 0 days 08:22:00 ... 0 days 17:02:00 0 days 17:22:00 0 days 17:42:00 0 days 18:02:00 0 days 18:22:00 0 days 18:42:00 0 days 19:02:00 0 days 19:22:00 0 days 19:42:00 0 days 20:02:00
Departure 0 days 05:22:00 0 days 06:02:00 0 days 05:42:00 0 days 06:22:00 0 days 06:42:00 0 days 07:02:00 0 days 07:22:00 0 days 07:42:00 0 days 08:02:00 0 days 08:22:00 ... 0 days 17:02:00 0 days 17:22:00 0 days 17:42:00 0 days 18:02:00 0 days 18:22:00 0 days 18:42:00 0 days 19:02:00 0 days 19:22:00 0 days 19:42:00 0 days 20:02:00
Glen Park Arrival 0 days 05:25:00 0 days 06:04:00 0 days 05:45:00 0 days 06:24:00 0 days 06:44:00 0 days 07:04:00 0 days 07:24:00 0 days 07:44:00 0 days 08:04:00 0 days 08:24:00 ... 0 days 17:04:00 0 days 17:24:00 0 days 17:44:00 0 days 18:04:00 0 days 18:24:00 0 days 18:44:00 0 days 19:04:00 0 days 19:24:00 0 days 19:44:00 0 days 20:04:00
Departure 0 days 05:25:00 0 days 06:05:00 0 days 05:45:00 0 days 06:25:00 0 days 06:45:00 0 days 07:05:00 0 days 07:25:00 0 days 07:45:00 0 days 08:05:00 0 days 08:25:00 ... 0 days 17:05:00 0 days 17:25:00 0 days 17:45:00 0 days 18:05:00 0 days 18:25:00 0 days 18:45:00 0 days 19:05:00 0 days 19:25:00 0 days 19:45:00 0 days 20:05:00
Balboa Park Arrival 0 days 05:27:00 0 days 06:07:00 0 days 05:47:00 0 days 06:27:00 0 days 06:47:00 0 days 07:07:00 0 days 07:27:00 0 days 07:47:00 0 days 08:07:00 0 days 08:27:00 ... 0 days 17:07:00 0 days 17:27:00 0 days 17:47:00 0 days 18:07:00 0 days 18:27:00 0 days 18:47:00 0 days 19:07:00 0 days 19:27:00 0 days 19:47:00 0 days 20:07:00
Departure 0 days 05:27:00 0 days 06:07:00 0 days 05:47:00 0 days 06:27:00 0 days 06:47:00 0 days 07:07:00 0 days 07:27:00 0 days 07:47:00 0 days 08:07:00 0 days 08:27:00 ... 0 days 17:07:00 0 days 17:27:00 0 days 17:47:00 0 days 18:07:00 0 days 18:27:00 0 days 18:47:00 0 days 19:07:00 0 days 19:27:00 0 days 19:47:00 0 days 20:07:00
Daly City Arrival 0 days 05:31:00 0 days 06:11:00 0 days 05:51:00 0 days 06:31:00 0 days 06:51:00 0 days 07:11:00 0 days 07:31:00 0 days 07:51:00 0 days 08:11:00 0 days 08:31:00 ... 0 days 17:11:00 0 days 17:31:00 0 days 17:51:00 0 days 18:11:00 0 days 18:31:00 0 days 18:51:00 0 days 19:11:00 0 days 19:31:00 0 days 19:51:00 0 days 20:11:00
Departure 0 days 05:31:00 0 days 06:11:00 0 days 05:51:00 0 days 06:31:00 0 days 06:51:00 0 days 07:11:00 0 days 07:31:00 0 days 07:51:00 0 days 08:11:00 0 days 08:31:00 ... 0 days 17:11:00 0 days 17:31:00 0 days 17:51:00 0 days 18:11:00 0 days 18:31:00 0 days 18:51:00 0 days 19:11:00 0 days 19:31:00 0 days 19:52:00 0 days 20:12:00
Berryessa / North San Jose Arrival NaT 0 days 04:49:00 NaT 0 days 05:09:00 0 days 05:29:00 0 days 05:49:00 0 days 06:09:00 0 days 06:29:00 0 days 06:49:00 0 days 07:09:00 ... 0 days 15:49:00 0 days 16:09:00 0 days 16:29:00 0 days 16:49:00 0 days 17:09:00 0 days 17:29:00 0 days 17:49:00 0 days 18:09:00 0 days 18:29:00 0 days 18:49:00
Departure NaT 0 days 04:49:00 NaT 0 days 05:09:00 0 days 05:29:00 0 days 05:49:00 0 days 06:09:00 0 days 06:29:00 0 days 06:49:00 0 days 07:09:00 ... 0 days 15:49:00 0 days 16:09:00 0 days 16:29:00 0 days 16:49:00 0 days 17:09:00 0 days 17:29:00 0 days 17:49:00 0 days 18:09:00 0 days 18:29:00 0 days 18:49:00
Milpitas Arrival NaT 0 days 04:53:00 NaT 0 days 05:13:00 0 days 05:33:00 0 days 05:53:00 0 days 06:13:00 0 days 06:33:00 0 days 06:53:00 0 days 07:13:00 ... 0 days 15:53:00 0 days 16:13:00 0 days 16:33:00 0 days 16:53:00 0 days 17:13:00 0 days 17:33:00 0 days 17:53:00 0 days 18:13:00 0 days 18:33:00 0 days 18:53:00
Departure NaT 0 days 04:53:00 NaT 0 days 05:13:00 0 days 05:33:00 0 days 05:53:00 0 days 06:13:00 0 days 06:33:00 0 days 06:53:00 0 days 07:13:00 ... 0 days 15:53:00 0 days 16:13:00 0 days 16:33:00 0 days 16:53:00 0 days 17:13:00 0 days 17:33:00 0 days 17:53:00 0 days 18:13:00 0 days 18:33:00 0 days 18:53:00
Warm Springs / South Fremont Arrival NaT 0 days 05:01:00 NaT 0 days 05:21:00 0 days 05:41:00 0 days 06:01:00 0 days 06:21:00 0 days 06:41:00 0 days 07:01:00 0 days 07:21:00 ... 0 days 16:01:00 0 days 16:21:00 0 days 16:41:00 0 days 17:01:00 0 days 17:21:00 0 days 17:41:00 0 days 18:01:00 0 days 18:21:00 0 days 18:41:00 0 days 19:01:00
Departure NaT 0 days 05:01:00 NaT 0 days 05:21:00 0 days 05:41:00 0 days 06:01:00 0 days 06:21:00 0 days 06:41:00 0 days 07:01:00 0 days 07:21:00 ... 0 days 16:01:00 0 days 16:21:00 0 days 16:41:00 0 days 17:01:00 0 days 17:21:00 0 days 17:41:00 0 days 18:01:00 0 days 18:21:00 0 days 18:41:00 0 days 19:01:00
Fremont Arrival NaT 0 days 05:07:00 NaT 0 days 05:27:00 0 days 05:47:00 0 days 06:07:00 0 days 06:27:00 0 days 06:47:00 0 days 07:07:00 0 days 07:27:00 ... 0 days 16:07:00 0 days 16:27:00 0 days 16:47:00 0 days 17:07:00 0 days 17:27:00 0 days 17:47:00 0 days 18:07:00 0 days 18:27:00 0 days 18:47:00 0 days 19:07:00
Departure NaT 0 days 05:07:00 NaT 0 days 05:27:00 0 days 05:47:00 0 days 06:07:00 0 days 06:27:00 0 days 06:47:00 0 days 07:07:00 0 days 07:27:00 ... 0 days 16:07:00 0 days 16:27:00 0 days 16:47:00 0 days 17:07:00 0 days 17:27:00 0 days 17:47:00 0 days 18:07:00 0 days 18:27:00 0 days 18:47:00 0 days 19:07:00
Union City Arrival NaT 0 days 05:12:00 NaT 0 days 05:32:00 0 days 05:52:00 0 days 06:12:00 0 days 06:32:00 0 days 06:52:00 0 days 07:12:00 0 days 07:32:00 ... 0 days 16:12:00 0 days 16:32:00 0 days 16:52:00 0 days 17:12:00 0 days 17:32:00 0 days 17:52:00 0 days 18:12:00 0 days 18:32:00 0 days 18:52:00 0 days 19:12:00
Departure NaT 0 days 05:12:00 NaT 0 days 05:32:00 0 days 05:52:00 0 days 06:12:00 0 days 06:32:00 0 days 06:52:00 0 days 07:12:00 0 days 07:32:00 ... 0 days 16:12:00 0 days 16:32:00 0 days 16:52:00 0 days 17:12:00 0 days 17:32:00 0 days 17:52:00 0 days 18:12:00 0 days 18:32:00 0 days 18:52:00 0 days 19:12:00

44 rows × 315 columns

[ ]: