Version Python (Open-meteo)

ProcédureIP-PYTHON-API_Open-meteo.com

Pré-requis

Site Open-meteo

Le module request en python est installé.

Variables - Structure conditionnelle - Fonctions - Modules :

Structure de données format JSON[1]

Structure de données Dataframe avec le module pandas.

Procédure
  1. manip 1 : mise en place

    Code

    1
    import requests
    2
    3
    # Exemple d'URL pour la météo de Paris
    4
    url = "https://api.open-meteo.com/v1/forecast?latitude=48.8566&longitude=2.3522&current_weather=true"
    5
    6
    response = requests.get(url)
    7
    data = response.json()
    8
    9
    print(data)
    10

    Résultat de data

    {'latitude': 48.16, 'longitude': 6.4599996, 'generationtime_ms': 0.055789947509765625, 'utc_offset_seconds': 0, 'timezone': 'GMT', 'timezone_abbreviation': 'GMT', 'elevation': 329.0, 'current_weather_units': {'time': 'iso8601', 'interval': 'seconds', 'temperature': '°C', 'windspeed': 'km/h', 'winddirection': '°', 'is_day': '', 'weathercode': 'wmo code'}, 'current_weather': {'time': '2025-09-08T06:45', 'interval': 900, 'temperature': 17.5, 'windspeed': 2.0, 'winddirection': 135, 'is_day': 1, 'weathercode': 61}}

    Résultat avec un format

    1
    {'latitude': 48.16, 'longitude': 6.4599996, 'generationtime_ms': 0.055789947509765625, 'utc_offset_seconds': 0, 'timezone': 'GMT', 'timezone_abbreviation': 'GMT', 'elevation': 329.0, 'current_weather_units': {'time': 'iso8601', 'interval': 'seconds', 'temperature': '°C', 'windspeed': 'km/h', 'winddirection': '°', 'is_day': '', 'weathercode': 'wmo code'}, 'current_weather': {'time': '2025-09-08T06:45', 'interval': 900, 'temperature': 17.5, 'windspeed': 2.0, 'winddirection': 135, 'is_day': 1, 'weathercode': 61}}

    RemarqueA retenir

    Une requête de type GET, quelles sont les autres disponibles ?

    Le format des données JSON (variable data) avec les {}, la notion de clé : valeur pour identifier les données.

    1
    print(data["latitude"])
    2
    3
    print(data["longitude"])
    4
    5
    print(data["elevation"])

    Observez plus précisément la clé current_weather qui contient une structure json avec ses propres clés, valeurs)

    1
    'current_weather': {'time': '2025-09-08T06:45', 'interval': 900, 'temperature': 17.5, 'windspeed': 2.0, 'winddirection': 135, 'is_day': 1, 'weathercode': 61}

    Pour récupérer les clés sous la clé current_weather, on peut extraire en priorité le json de la clé current_weather, puis ensuite, les clés time et temperature :

    1
    current_weather = data["current_weather"]
    2
    print(current_weather)
    3
    temperature = current_weather["temperature"]
    4
    datetime = current_weather["time"]
    5
    print(f"Température actuelle à Epinal: {temperature}°C à {datetime}")

    .

    Truc & astuceécritures différentes pour récupérer les données

    1. current_weather = data["current_weather"]

      • Utilise la syntaxe par clé avec les crochets.
      • Si la clé "current_weather" n'existe pas dans le dictionnaire data, cela entraînera une exception KeyError.
      • Cela suppose que vous êtes sûr que la clé existe dans le dictionnaire.
    2. temperature = current_weather.get('temperature')

      • Utilise la méthode get() du dictionnaire.
      • Si la clé 'temperature' n'existe pas dans current_weather, au lieu de générer une erreur, cela renvoie None par défaut (ou une valeur spécifiée si vous la fournissez comme second argument, par exemple get('temperature', 0)).
      • C'est une façon plus sûre d'accéder à une clé qui pourrait manquer.
  2. manip 2 : la requête avec params

    Code

    1
    import requests
    2
    3
    # Coordonnées de la ville (exemple : Paris)
    4
    latitude = 48.8566
    5
    longitude = 2.3522
    6
    7
    # Définir les paramètres dans un dictionnaire
    8
    params = {
    9
        'latitude': latitude,
    10
        'longitude': longitude,
    11
        'current_weather': 'true'
    12
    }
    13
    14
    # Faire la requête en passant les paramètres
    15
    response = requests.get("https://api.open-meteo.com/v1/forecast", params=params)
    16
    17
    # Récupérer et afficher la réponse JSON
    18
    data = response.json()
    19
    print(data)
    20

    Remarque

    C'est une autre façon en manipulant les chaînes de caractères et le contenu des variables dans les expressions avec les {} :

    • Plus clair, plus facile à maintenir.
    • Pas besoin de construire manuellement l’URL finale.
    • requests encode automatiquement les paramètres dans l’URL.
  3. manip 3 : utiliser geocode

    Code avec le module geopy

    1
    from geopy.geocoders import Nominatim
    2
    import requests
    3
    4
    # 1. Géocoder : convertir le nom de la ville en coordonnées
    5
    ville = "Epinal"  # Changez cette valeur si vous souhaitez une autre ville
    6
    geolocator = Nominatim(user_agent="mon_app")
    7
    location = geolocator.geocode(ville)
    8
    9
    if location:
    10
        latitude = location.latitude
    11
        longitude = location.longitude
    12
        print(f"Coordonnées de {ville} : {latitude}, {longitude}")
    13
    14
        # 2. Préparer les paramètres pour l'API
    15
        params = {
    16
            'latitude': latitude,
    17
            'longitude': longitude,
    18
            'current_weather': 'true'
    19
        }
    20
    21
        # 3. Faire la requête GET avec requests et paramètres
    22
        url = "https://api.open-meteo.com/v1/forecast"
    23
        response = requests.get(url, params=params)
    24
        data = response.json()
    25
    26
        # 4. Afficher les données
    27
        if 'current_weather' in data:
    28
            current = data['current_weather']
    29
            print(f"Météo actuelle à {ville} :")
    30
            print(f"  Température : {current['temperature']}°C")
    31
            print(f"  Vitesse du vent : {current['windspeed']} km/h")
    32
            print(f"  Heure : {current['time']}")
    33
        else:
    34
            print("Données météorologiques non disponibles.")
    35
    else:
    36
        print(f"Impossible de géocoder la ville: {ville}")
  4. manip 4 : Structure dataframe avec pandas
    1
    import requests
    2
    import pandas as pd
    3
    #structure attendue pour la réponse
    4
    # {
    5
    #   ...
    6
    #   "hourly": {
    7
    #     "time": ["2022-06-19t00:00","2022-06-19t01:00", ...],
    8
    #     "wind_speed_10m": [3.16,3.02,3.3,3.14,3.2,2.95, ...],
    9
    #     "temperature_2m": [13.7,13.3,12.8,12.3,11.8, ...],
    10
    #     "relative_humidity_2m": [82,83,86,85,88,88,84,76, ...],
    11
    #   }
    12
    # }
    13
    url = "https://api.open-meteo.com/v1/forecast?latitude=48.8566&longitude=2.3522&past_days=10&hourly=temperature_2m,relative_humidity_2m,wind_speed_10m"
    14
    response = requests.get(url)
    15
    data = response.json()
    16
    hourly_data = data.get('hourly')
    17
    # print(data)
    18
    # écriture ddes données au format dataframe pandas (eq. tableau 2 dimensions)
    19
    df = pd.DataFrame(hourly_data)
    20
    print(df.head()) # pour afficher les 5 poremières lignes
    21
    #print(df) # pour afficher l'ntégralité des données
  5. manip 4 : sauvegarde dans Excel
    1
    df.to_excel("meteo_paris.xlsx", index=False)
    2
    print("Fichier sauvegardé.")
  6. manip 5 : moyennes journalières à partir des valeurs par heure
    1
    import json
    2
    from collections import defaultdict
    3
    from datetime import datetime
    4
    5
    # Exemple de données JSON, vous pouvez la charger depuis un fichier ou une variable
    6
    data_json = '''
    7
    {
    8
       "hourly": {
    9
         "time": ["2022-06-19T00:00", "2022-06-19T01:00", "2022-06-19T02:00", "2022-06-20T00:00", "2022-06-20T01:00"],
    10
         "temperature_2m": [13.7, 13.3, 12.8, 14.0, 14.5]
    11
       }
    12
    }
    13
    '''
    14
    15
    # Charger les données JSON
    16
    data = json.loads(data_json)
    17
    18
    # Accéder à la liste de temps et de températures
    19
    times = data['hourly']['time']
    20
    temperatures = data['hourly']['temperature_2m']
    21
    22
    # Dictionnaire pour stocker la somme et le nombre de valeurs par date
    23
    daily_temps = defaultdict(lambda: {'sum': 0, 'count': 0})
    24
    25
    # Parcourir les données
    26
    for t, temp in zip(times, temperatures):
    27
        # Extraire la date (format: 'YYYY-MM-DD')
    28
        date_str = t.split('T')[0]
    29
        # Accumuler la température
    30
        daily_temps[date_str]['sum'] += temp
    31
        daily_temps[date_str]['count'] += 1
    32
    33
    # Calculer la moyenne journalière
    34
    moyenne_journaliere = {}
    35
    for date, values in daily_temps.items():
    36
        moyenne = values['sum'] / values['count']
    37
        moyenne_journaliere[date] = moyenne
    38
    39
    # Afficher les résultats
    40
    for date, moyenne in moyenne_journaliere.items():
    41
        print(f"{date} : {moyenne:.2f} °C")