We will use the train timetable data available at https://data.gov.in/catalog/indian-railways-train-time-table-0 to start.
In [1]:
import csv
def _convert_time_to_minutes(time):
return time[0] * 60 + time[1]
def _convert_time_to_string(time):
zero_pad = lambda x : len(x) == 1 and '0' + x or x
hour = zero_pad(str(time[0]))
minute = zero_pad(str(time[1]))
return hour + ":" + minute
class Train:
train_no = None
train_name = None
islno = None
station_code = None
station_name = None
arrival_time = None
departure_time = None
distance = None
source_station_code = None
source_station_name = None
destination_station_code = None
destination_station_name = None
def __init__(self, csvitem):
self.train_no = csvitem[0].strip()
self.train_name = csvitem[1].strip()
self.islno = csvitem[2].strip()
self.station_code = csvitem[3].strip()
self.station_name = csvitem[4].strip()
parse_hour_minute = lambda arrival_time : (int(arrival_time[:2]), int(arrival_time[3:5]))
self.arrival_time = parse_hour_minute(csvitem[5].replace("'", '').strip())
self.departure_time = parse_hour_minute(csvitem[6].replace("'", '').strip())
self.distance = csvitem[7].strip()
self.source_station_code = csvitem[8].strip()
self.source_station_name = csvitem[9].strip()
self.destination_station_code = csvitem[10].strip()
self.destination_station_name = csvitem[11].strip()
def get_arrival_minute(self):
return _convert_time_to_minutes(self.arrival_time)
def get_arrival_time_string(self):
return _convert_time_to_string(self.arrival_time)
def get_departure_minute(self):
return _convert_time_to_minutes(self.departure_time)
def get_departure_time_string(self):
return _convert_time_to_string(self.departure_time)
In [2]:
#f = open('/home/kumar/Downloads/isl_wise_train_detail_03082015_v1.csv', 'r')
import urllib.request
import codecs
f = urllib.request.urlopen('https://data.gov.in/sites/default/files/datafile/isl_wise_train_detail_03082015_v1.csv')
# Skip first line
f.readline()
reader = csv.reader(codecs.iterdecode(f, 'utf-8'))
#reader = csv.reader(f)
train_list = []
for i in reader:
train_list.append(Train(i))
print("Read %d trains!" % len(train_list))
In [3]:
# Find all trains that leave from Dadar
print(set([t.train_name for t in train_list if t.source_station_code == 'MAS']))
# Find trains that arrive in Dadar
dr_arr = list(filter(lambda t : t.destination_station_code == 'DR', train_list))
dr_deps = list(filter(lambda t : t.source_station_code == 'DR', train_list))
# Find the train that arrives earliest from Dadar
earliest_dr_arrival = min(dr_arr, key=lambda t : t.get_arrival_minute())
print("%s arrives at Dadar at %s" % (earliest_dr_arrival.train_name, earliest_dr_arrival.get_arrival_time_string()))
# Find the train that departs earliest from Dadar
earliest_dr_dep = min(dr_deps, key=lambda t : t.get_departure_minute())
print("%s departs Dadar at %s" % (earliest_dr_dep.train_name, earliest_dr_dep.get_departure_time_string()))
# Find trains that leave Dadar ordered by departure time
sorted_dr_deps = sorted(dr_deps, key=lambda t : t.get_departure_minute())
for i in sorted_dr_deps:
print("%s leaves at %s." % (i.train_name, i.get_departure_time_string()))