1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
| #!/usr/bin/env python3
# coding: utf-8
import csv
import tkinter as tk
from tkinter import ttk
from tkcalendar import DateEntry
from datetime import datetime, timedelta
import pathlib
# Le chemin de base contenant les fichiers CSV (on y met le chemin que l'on veut)
CSVDIR="."
def normalize_time_str(time_str):
(hh, mm, ss)=map(int, time_str.split(":"))
if ss >= 60:
mm+=ss/60
ss=ss%60
# if
if mm >= 60:
hh+=ss/60
mm=mm%60
# if
return "%02d:%02d:%02d" % (hh%24, mm, ss)
# normalize_time_str()
def search_occurrences():
target_date = date_entry.get_date().strftime('%Y-%m-%d')
target_hour_str = time_combobox.get()
target_hour = datetime.strptime(target_hour_str, "%H:%M:%S").time()
# Charger les fichiers GTFS
stop_times_file = pathlib.Path(CSVDIR, 'stop_times.txt')
trips_file = pathlib.Path(CSVDIR, 'trips.txt')
calendar_dates_file = pathlib.Path(CSVDIR, 'calendar_dates.txt')
# Dictionnaire pour stocker les horaires de départ et d'arrivée
stop_times = {}
# Lire le fichier stop_times et extraire les horaires de départ et d'arrivée
with open(stop_times_file, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
print(row)
trip_id = row['trip_id']
arrival_time_str = normalize_time_str(row['arrival_time'])
departure_time_str = normalize_time_str(row['departure_time'])
try:
arrival_time = datetime.strptime(arrival_time_str, "%H:%M:%S").time()
departure_time = datetime.strptime(departure_time_str, "%H:%M:%S").time()
except ValueError:
continue
stop_times.setdefault(trip_id, list()).append((arrival_time, departure_time))
# for
# with
# Dictionnaire pour stocker les service_id correspondants à la date sélectionnée
calendar_dates = {}
# Lire le fichier calendar_dates et filtrer les service_id pour la date sélectionnée
with open(calendar_dates_file, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
service_id = row['service_id']
date = datetime.strptime(row['date'], "%Y%m%d").date()
if date == datetime.strptime(target_date, "%Y-%m-%d").date():
calendar_dates[service_id] = True
# for
# with
# Dictionnaire pour stocker les occurrences par route_short_name
route_counts = {}
# Lire le fichier trips et effectuer les calculs d'occurrences
with open(trips_file, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
trip_id = row['trip_id']
service_id = row['service_id']
if service_id not in calendar_dates or trip_id not in stop_times: continue
route_id = row['route_id']
for (arrival_time, departure_time) in stop_times[trip_id]:
# Gérer l'heure de 24:00:00 comme une occurrence le jour suivant
if departure_time < arrival_time:
departure_time = datetime.combine(datetime.min.date(), departure_time)
departure_time += timedelta(days=1)
departure_time = departure_time.time()
# if
if arrival_time <= target_hour <= departure_time:
route_short_name = get_route_short_name(route_id)
route_counts[route_short_name]=route_counts.setdefault(route_short_name, 0) + 1
# if
# for
# for
# with
# Trier la liste des résultats en plaçant les lettres d'abord, puis les chiffres
def sort_key(item):
route_short_name = item[0]
count = item[1]
if route_short_name.isnumeric():
return (float("inf"), int(route_short_name), count)
else:
return (ord(route_short_name[0]), route_short_name, count)
# sort_key
sorted_results = sorted(route_counts.items(), key=sort_key)
# Générer le texte des résultats triés
result_text = 'Occurrences par route_short_name :\n\n'
for route_short_name, count in sorted_results:
result_text += f'{route_short_name}: {count}\n'
# Effacer le contenu précédent dans le widget Text
result_text_widget.delete(1.0, tk.END)
# Afficher les résultats triés dans le widget Text
result_text_widget.insert(tk.END, result_text)
# search_occurrences()
def get_route_short_name(route_id):
with open(routes_file, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
if row['route_id'] == route_id:
return row['route_short_name']
# for
# with
return route_id
# get_route_short_name
if __name__ == '__main__':
root = tk.Tk()
root.title("Occurrences")
date_label = ttk.Label(root, text="Date:")
date_label.pack()
date_entry = DateEntry(root, date_pattern='yyyy-mm-dd')
date_entry.pack()
time_label = ttk.Label(root, text="Heure (HH:MM:SS):")
time_label.pack()
time_combobox = ttk.Combobox(root, values=[f'{i:02d}:00:00' for i in range(24)])
time_combobox.pack()
search_button = ttk.Button(root, text="Rechercher", command=search_occurrences)
search_button.pack()
result_text_widget = tk.Text(root)
result_text_widget.pack()
# Définir le chemin du fichier routes.txt
routes_file = pathlib.Path(CSVDIR, 'routes.txt')
root.mainloop()
# if |