top of page

Tuto : accéder au débit des fleuves français via l’API Hub’eau avec Python

Dernière mise à jour : 7 nov.


Avec la sécheresse très sévère qui s’annonce, suivre le débit des fleuves et des rivières est particulièrement utile : production d’eau potable, irrigation des cultures, refroidissement de centrales électriques, activités touristiques… de nombreux secteurs dépendent directement des eaux de surface. Des données de débit précises et actualisées peuvent les aider à anticiper les déficits hydriques et à s’y adapter.



Dans ce tutoriel, nous allons voir comment accéder au débit d’un cours d’eau en temps réel via l’API Hub’eau et comment exploiter ces données avec Python.


Utiliser l’API du système d’information sur l’eau (SIE)


Avec près de 3000 stations hydrométriques en métropoles et en outremer, le système d’information sur l’eau permet d’obtenir des données de débit en temps réel pour la plupart des cours d’eau français.


Les mesures peuvent être visualisées directement, par exemple via le site Vigiecrues. Cependant ce service ne permet pas de télécharger les données pour faire vos propres analyses, ni d’obtenir des mesures remontant à plus de quelques semaines. Pour cela, il faudra passer par l’API hydrométrie.


Comment fonctionne cette API ? Voici une façon très simple de l’utiliser :


  1. Trouver le code de la station hydrométrique qui vous intéresse : imaginons que l’on veuille obtenir le débit de la Seine à Paris, on peut facilement trouver la station la plus proche grâce à cette carte interactive. C’est la station du pont d’Austerlitz qui porte le code F700000103.

  2. Télécharger les données directement avec l’url correspondant à la station : dans notre cas, il suffit de rentrer dans un navigateur web l’adresse suivante : https://hubeau.eaufrance.fr/api/v1/hydrometrie/observations_tr.csv?code_entite=F700000103. Pour une autre station, il faudra simplement changer le code_entite .


En complétant l’url, vous pouvez affiner un peu plus votre recherche. Voici quelques unes des options :





Exploiter l’API avec Python


Cette méthode simple vous permet d’obtenir les données sous format .csv, vous pouvez donc facilement les ouvrir et les exploiter avec un tableur, par exemple Microsoft Excel ou OpenOffice Calc.

Pour une analyse qui porte sur de nombreuses stations ou qui doit être répétée régulièrement, ce traitement manuel va cependant rapidement devenir pénible… voici donc comment télécharger ces données directement avec Python.


Pour commencer, il va falloir comme précédemment définir l’url à récupérer :


  1. from datetime import datetime, timedelta

  2. #Stations à télécharger

  3. station = "F700000103"

  4. #Période : les 10 derniers jours

  5. debut = (datetime.now()-timedelta(10)).isoformat()

  6. url_API = "https://hubeau.eaufrance.fr/api/v1/hydrometrie/observations_tr.csv"

  7. url = url_API+ f"?code_entite={station}&grandeur_hydro=Q&size=10000&date_debut_obs={debut}"


Ensuite, on récupère la réponse de l’API à cette requête et on la met dans un dataframe :


  1. from urllib.request import Request, urlopen

  2. from io import StringIO

  3. from bs4 import BeautifulSoup

  4. import pandas as pd

  5. with urlopen(Request(url)) as reponse:

  6. soup = BeautifulSoup(reponse.read(), 'html.parser')

  7. df = pd.read_csv(StringIO(str(soup)), sep = ';')


Maintenant, libre à vous d’exploiter ces données comme vous le souhaitez. Pour commencer, on peut par exemple les représenter sur un graphique :


  1. import matplotlib.pyplot as plt

  2. import matplotlib.dates as mdates

  3. #Conversion des dates en datetime

  4. df["date_obs"] = pd.to_datetime(df["date_obs"])

  5. #Conversion des débits en m3/s

  6. df["resultat_obs"] = df["resultat_obs"]/1000

  7. fig, ax = plt.subplots(figsize = (12, 6), facecolor = 'w')

  8. ax.plot(df.date_obs, df.resultat_obs)

  9. #Affichage du cadrillage

  10. ax.grid(True, alpha = 0.5)

  11. #Mise en forme de l'axe des x

  12. days = mdates.DayLocator()

  13. ax.xaxis.set_major_locator(days)

  14. day_fmt = mdates.DateFormatter('%d/%m')

  15. ax.xaxis.set_major_formatter(day_fmt)

  16. #Nom des axes

  17. ax.set_ylabel("Débit (m3/s)")

  18. ax.set_xlabel("Date")

  19. plt.show()


Voici le résultat obtenu :


Graphique des résultats API du système d’information sur l’eau (SIE)

Application : le débit du jour est-il normal ?


Voici un exemple d’utilisation un peu plus complexe de cette API.


Notre objectif est de savoir si le débit actuel pour une station est normal, ou bien inférieur ou supérieur aux valeurs enregistrées les années précédentes pour la même journée.

Nous allons donc :

  1. Récupérer les débit enregistrés sur les 24 dernières heures et calculer la moyenne,

  2. Récupérer les archives des débits moyens journaliers et calculer la moyenne historique pour le même jour du même mois,

  3. Comparer les deux pour voir si le débit actuel est supérieur ou inférieur à la normale.


Pour récupérer les débits des 24 dernières heures, il suffit de reproduire ce que l’on a déjà fait :


  1. #Stations à télécharger

  2. station = "F700000103"

  3. #Période à récupérer : 1 jour

  4. debut = (datetime.now()-timedelta(1)).isoformat()

  5. url_API = "https://hubeau.eaufrance.fr/api/v1/hydrometrie/observations_tr.csv"

  6. url = url_API+ f"?code_entite={station}&grandeur_hydro=Q&size=10000&date_debut_obs={debut}"

  7. with urlopen(Request(url)) as reponse:

  8. soup = BeautifulSoup(reponse.read(), 'html.parser')

  9. df = pd.read_csv(StringIO(str(soup)), sep = ';')

  10. #Calcul de la moyenne

  11. debit_24h = df.resultat_obs.mean()

  12. debit_24h = debit_24h / 1000 #Conversion en m3/s


La même API permet de récupérer les historiques de débits moyens journaliers, il suffit de modifier légèrement l’url :


  1. url_API = "https://hubeau.eaufrance.fr/api/v1/hydrometrie/obs_elab.csv"

  2. url = url_API+ f"?code_entite={station}&grandeur_hydro_elab=QmJ&size=10000"

  3. with urlopen(Request(url)) as reponse:

  4. soup = BeautifulSoup(reponse.read(), 'html.parser')

  5. df = pd.read_csv(StringIO(str(soup)), sep = ';')


On va sélectionner dans le dataframe obtenu les valeurs correspondants à la date du jour puis faire la moyenne :


  1. #date du jour

  2. from datetime import date

  3. date_du_jour = date.today()

  4. #Conversion des dates en datetime

  5. df["date_obs_elab"] = pd.to_datetime(df["date_obs_elab"], format = '%Y-%m-%d')

  6. #Sélection des mesures effectuées le même jour et le même mois

  7. df_histo_du_jour = df[(df.date_obs_elab.dt.day == date_du_jour.day) &

  8.                                    (df.date_obs_elab.dt.month == date_du_jour.month)]

  9. #Calcul de la moyenne

  10. debit_normal_du_jour = df_histo_du_jour.resultat_obs_elab.mean()

  11. debit_normal_du_jour = debit_normal_du_jour / 1000


Il ne reste plus qu’à calculer la différence entre les deux et à afficher le résultat, par exemple de cette façon :


  1. delta = (debit_24h - debit_normal_du_jour)/ debit_normal_du_jour

  2. print(f"Le débit sur 24h est {'inferieur' if delta < 0 else 'superieur'} \

  3. de {abs(delta)*100:.1f}% au débit normal pour cette journée.")


Et voici le résultat obtenu :

Le débit sur 24h est inférieur de 43.9% au débit normal pour cette journée.


 


A propos : Callendar est une start-up spécialisée dans le développement de solutions innovantes pour l’évaluation des risques climatiques. Conscients du défi que représente l’adaptation au changement climatique, nous nous efforçons de partager notre expertise au travers d’outils gratuits ou de tutoriels comme celui-ci.

bottom of page