Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Et si pour mon usage personnel. Depuis 15ans je prend les fiches horaires ligne par ligne puis je regarde le temps de trajet generalement le depart apres 8h ou celui qui est ecrit apres la periode de frequence. Puis soit je met la frequence soit je la calcule sur la periode 7h 9h. Avec ca jai le temps de trajet aller retour et je rajoute une duree moyenne entre ses 2 temps. Avec ca ca me dit le nombre de bus nessessaire. Cest seulement une estimation vue que le temps de pause au terminus et le temps reel de trajet sur les lignes a frequence je ne lai ai pas sur les fiches horaires. Faire ca 200fois cest tres tres long. Je suis suporter du TFC et le responsable data a donner les grandes lignes de son fonctionnement et notament le trie des info recu pour garder les voulus. Donc pourquoi pas faire pareil pour ne pas y passer 1moi a chaque changement horaire. Jai vue quil y avais des programmes sur le web. Je penser que falais juste les configurer pour avoir ce que je voulais mais le plus simple sera de me faire un truc de A a Z. Je vais dans un premier temps voir si sur libre office je peux avoir le resultat voulu. Mais je sais que a chaque modification horaire faudras que je refaire des reglages. Ce qui se fera automatiquement avec le programe. Mais ca cest pas dessuite.
Et les données à traiter (le fichier GTFS) tu les prends où?
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Actuellement sur https://www.tisseo.fr/se-deplacer/horaires mais si j'arrive a automatiser tous ca sa sera sur https://transport.data.gouv.fr/datas...transport-gtfs
D'après ce que je vois, les données sont en CSV (ou alors le gtfs c'est un simple CSV?).
Ca ressemble à une base de données descendue à plat. Si on arrive à faire le lien entre les différents champs, on peut remonter tout le fil.
Exemple, le fichier "calendar_dates" contient cette ligne: 1102869,20230701,1. La valeur "20230701" est la date et l'autre valeur "1102869" est un identifiant, identifiant qui permet de faire le lien avec le fichier "trips" sur cette ligne line:74,1102869,1766028,1,10825.
Donc si par exemple je cherche "20230701" dans "calendar_dates" je récupère "1102869" qui me permet alors d'aller chercher l'info qui va bien dans le fichier "trips". Et ainsi de suite.
Accessoirement si t'es plus familier avec le shell (vu que tu bosses sous Ubuntu ça pourrait être le cas), tu pourrais passer par ce langage qui serait peut-être plus adapté (grep pour extraire les lignes, cut pour les couper et etc). Oui j'aime beaucoup Python mais pas au point de manquer d'équité. La configuration Unix étant constituée de fichiers CSV, il est naturel que le shell ait à sa disposition des outils pour les traiter et soit donc plus adapté que Python pour ça.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Merci mais j'ai trouver un amis d'un amis qui sy connait et qui me fait un script. Oui effectivement faut aller dans un fichier prendre les infos voulu puis voir dans un autre pour continuer a reduire a liste puis après aller dans d'autre fichier pour traduire ce code et l'afficher avec les nom commercial utiliser.
Merci beaucoup a vous tous pour votre aide qui est précieuse car vous m'avez donner beaucoup d'information importante qui me serviront dans ma culture (certes microscopique) de la programmation.
Voici ce que je voie:
Et le script ou j'ai un racoucie qui lance l'interface sans aller dans le script:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #!/usr/bin/env python3 import csv import tkinter as tk from tkinter import ttk from tkcalendar import DateEntry from datetime import datetime, timedelta def normalize_time_str(time_str): if time_str == '24:00:00': return '00:00:00' return 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 = '/media/bonnefoy/Bus/GTFS/stop_times.txt' trips_file = '/media/bonnefoy/Bus/GTFS/trips.txt' calendar_dates_file = '/media/bonnefoy/Bus/GTFS/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: 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 if trip_id not in stop_times: stop_times[trip_id] = [] stop_times[trip_id].append((arrival_time, departure_time)) # 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 # 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'] route_id = row['route_id'] if service_id in calendar_dates and trip_id in stop_times: 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 arrival_time <= target_hour <= departure_time: route_short_name = get_route_short_name(route_id) if route_short_name in route_counts: route_counts[route_short_name] += 1 else: route_counts[route_short_name] = 1 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) # Trier la liste des résultats en plaçant les lettres d'abord, puis les chiffres 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) 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'] return route_id 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 = '/media/bonnefoy/Bus/GTFS/routes.txt' root.mainloop()
J'aime bien ce script. Ton copain a des qualités en Python. Juste qu'il ne connait pas dict.set_default() qui permet d'éviter if key in dict mais c'est pas super grave.
Je te l'ai toutefois (je pense) un peu amélioré. Surtout en ce qui concerne l'emplacement des fichiers (j'ai trouvé ça un peu rigide)
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
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
Je l'ai testé, il donne les même résultats.
Après on peut rajouter une configuration ce qui permettrait de mettre certains détails en paramètre (exemple le chemin des fichiers) mais ce sera pour plus tard.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Merci
J'ai tester ton code et vous avez le même probleme. En soit c'est pas grave mais il manque des service_id dans les calculs. Je pense que ça doit soit venir de ma façon appréhender les calculs soit des fichiers. En fesant plusieurs recherche a des heures différentes j'arrive a avoir un chiffre qui semble correcte. 2mn de calcul au lieu de plusieurs heures par jour pendant plusieurs semaines ca va me changer la vie. Merci beaucoup a tous pour votre aide
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Cest pas grave. En regardant a plusieurs heure differente jarrive a me faire une idee. Ca reste enormement plus rapide que avec les pdf
Toi lavantage cest que si je change de dossier je le signale 1 fois. Lui beaucoup. Mais chaquun sa signature et ca change rien si le resultat et le meme.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Il ne mélange pas les service_id mais il en oublie. Quand je lance une recherche a 8h sur la ligne 39 j'ai aucun bus alors que il y en as 2 et sur certaine ligne je trouve qu'il n'y en as pas beaucoup.
Partager