Tuto : Calculer une normale climatique avec Python et ERA5-Land

Callendar
9 min readJul 21, 2020

--

Dès que la température monte un petit peu, la question revient : il fait chaud, certes, mais fait-il anormalement chaud ? Est-ce une chaleur habituelle pour un mois d’été, ou quelque chose d’autre ?

Si vous voulez apprendre à répondre à cette question, ce tuto est fait pour vous !

Nous allons voir :

  1. Ce qu’est une normale climatologique standard selon la définition de l’Organisation Météorologique Mondiale,
  2. Comment calculer une normale locale malgré la faible disponibilité des observations météorologiques grâce aux réanalyses,
  3. Comment accéder à ces données partout dans le monde via le “Climate data store” du programme européen d’observation de la Terre,
  4. Comment calculer la température normale annuelle et mensuelle avec Python.

Vous pouvez trouver ici une version actualisée de cet article suite à la mise à jour du Climate Data Store en 2024.

Qu’est-ce qu’une normale climatique ?

Il n’est pas simple de définir une température normale, en particulier dans une période où, comme maintenant, le climat n’est pas stationnaire. Cependant, dans ce tutoriel, nous allons nous en tenir à la définition donnée par l’Organisation Météorologique Mondiale :

Une normale est une “moyenne calculée pour une période uniforme et relativement longue comprenant au moins trois périodes consécutives de dix ans.”

Il n’existe donc pas une mais des normales. L’OMM distingue les normales standards portant sur une période de 30 ans débutant le 1er janvier d’une année se terminant par 1, et parmi celles-ci la normale de référence calculée entre le 1er janvier 1961 et le 31 décembre 1990.

Indication supplémentaire : les résultats sont exprimées au dixième près. Selon l’OMM, il n’est généralement pas utile de publier les normales avec plus de précision.

Pas d’observations météo ? (Presque) pas de problème !

Dans ce tutoriel, nous allons calculer la normale standard la plus récente, c’est-à-dire du 01/01/1981 au 31/12/2010, pour la température dans la bonne ville de Tarbes (Hautes-Pyrénées).

La première difficulté, et non des moindres, consiste à trouver un historique local de température sur près de 40 ans.

Dans la réalité, les mesures fiables de températures sur une aussi longue période sont très rares. En France métropolitaine, le Global Historical Climatology Network référence moins d’une trentaine de stations et sans surprise il n’y en pas à Tarbes : les plus proches se trouvent à l’observatoire du Pic du Midi et à l’aéroport de Toulouse-Blagnac…

Très souvent, il n’existe pas d’observations météorologiques locales sur une durée assez longue pour le calcul d’une normale. Dans ce cas, la solution consiste à utiliser un historique réanalysé.

La réanalyse est une méthode qui combine des observations (stations, satellite, radar…) et un modèle météorologique pour produire un historique avec une résolution spatiale et temporelle fine.

La résolution spatiale d’ERA5-Land (à droite) comparée aux réanalyses plus anciennes de l’ECMWF (ERA Interim à gauche et ERA5 au centre)

La production de réanalyses n’est à la portée que de quelques grands centres de prévision, les plus connus sont le National Center for Environmental Prediction (NCEP) aux Etats-Unis et l’European Center for Medium-Range Weather Forcasts (ECMWF) en Europe. Ce sont les données de ce dernier que nous allons utiliser.

Télécharger manuellement les température d’ERA5-Land

Pour accéder aux réanalyses de températures produites par l’ECMWF, la solution la plus immédiate consiste à aller sur le Climate Data Store de Copernicus, le programme européen d’observation de la Terre.

Plusieurs réanalyses sont disponibles, la plus récente et la plus détaillée est ERA5-Land. Vous pouvez la trouver en tapant “ERA5 Land” dans le champ de recherche :

Deux pas de temps sont disponibles : mensuel et horaire. Nous allons (au grand désespoir de notre fournisseur internet) utiliser les données horaires, sélectionnez-les en cliquant sur “ERA5-Land hourly data from 1981 to present” dans les résultats de la recherche.

L’onglet “Download data” vous permet de choisir les données que vous allez télécharger :

  • Dans le champ “Variable”, cochez la température à 2 mètres du sol : “2m temperature” (et notez le nombre impressionnant de variables disponibles !),
  • Dans le champ “Year”, sélectionnez toutes les années de 1981 à 2010,
  • Dans les champs “Month”, “Day” et “Time”, cliquez à chaque fois sur “Select all”
  • Pour éviter de trop surcharger notre disque dur, nous n’allons pas télécharger les données pour l’ensemble de la planète mais seulement pour la France métropolitaine. Dans le champ “Geographical area”, sélectionnez “Sub-region extraction” et remplissez les limites du domaine : 41 pour la latitude sud, 52 pour la latitude nord, -5 pour la longitude ouest et 9 pour la longitude est. Vous pourriez évidemment choisir une autre zone mais attention quand même au volume des données : 30 années de réanalyse horaire pour la France représente déjà près de 8Go.
  • Enfin, dans le champ “Format”, sélectionnez “NetCDF”.

Arrivé en bas de la page, vous chercherez en vain comment passer à l’étape suivante : à la place de l’onglet qui permettrait de lancer le téléchargement, un message d’erreur s’affiche “Request too large: 267840 items requested, the current limit is 100000. Please reduce your selection”.

Une solution consisterait à télécharger nos données en plusieurs fois, par exemple décennie par décennie. Décocher les années de 1992 à 2010 dans le champ “Year”, puis, après avoir créé un compte et vous être connecter, cliquez sur “Submit form”. Il vous faudra ensuite attendre que le fichier soit prêt (ce qui peut prendre plus d’une heure), le télécharger et répéter autant de fois que nécessaire…

Automatisation du téléchargement avec l’API du Climate Data Store et Python

Si vous vous voulez vous épargner ce travail fastidieux, il existe une solution plus efficace : passer par l’API du Climate Data Store.

Attention : La méthode d’accès aux données Copernicus/ECMWF a légèrement changé suite à une mise à jour du Climate Data Store en 2024. Une version actualisé de cet article est disponible ici.

Pour commencer, installez la librairie cdsapi, par exemple avec :

pip install cdsapi

Une fois que c’est fait, cherchez sur votre disque un fichier nommé .cdsapirc, il se trouve normalement dans “C:\Users\Username”. Ouvrez ce fichier avec un éditeur de texte.

Si vous ne l’avez pas encore fait, créez un compte sur le CDS, connectez-vous et allez sur cette page. Dans la partie “Install the CDS API key”, vous trouverez deux lignes comme celles-ci :

Copiez-les dans le fichier .cdsapirc, enregistrez et fermez.

Nous pouvons maintenant télécharger les données directement avec quelques lignes de Python :

L’exécution due code ci-dessus va télécharger la température réanalysée entre 1981 et 2010 sous la forme de fichiers annuels appelés, par exemple, ERA5Land_t2m_France_2010.nc. Vous n’avez plus besoin que de patience…

Calcul de la normale annuelle 1981–2010

Une fois les historiques de température téléchargés, passons au traitement.

L’ouverture des fichiers se fait avec xarray :

import xarray as xr
import os
dossier = "ERA5Land_Temperature"
DS = xr.open_mfdataset(os.path.join(dossier, '*.nc'))

open_mfdataset() permet d’ouvrir et de combiner automatiquement tous les .nc présent dans le dossier “ERA5Land_Temperature” sous la forme d’un dataset unique, DS.

Un dataset peut contenir plusieurs jeux de données (ou DataArray) partageant un système de coordonnées, par exemple la température et les précipitations sur une même grille géographique, sur la même période et avec le même pas de temps. Ce n’est pas le cas ici puisque nous n’avons que la température mais il faut tout de même extraire l’unique DataArray de notre dataset.

La synthaxe est la même que pour accéder à une valeur d’un dictionnaire en utilisant le nom de la variable comme clé : DS[‘t2m’]. Ou encore plus simplement :

da = DS.t2m

On peut voir quelle est l’unité utilisée avec :

da.attrs[‘units’]

La température est en Kelvin. Des degrés Celcius seraient plus adaptés, on va donc convertir :

da = da - 273.15
da.attrs['units'] = '°C'

Sélectionnons maintenant les températures à Tarbes. Une rapide recherche nous apprend que la ville est située à la latitude 43.2333 et à la longitude 0.0833.

On peut arrondir ces valeurs au dixième, ce qui correspond à la résolution spatiale d’ERA5-Land, ou bien simplement utiliser method = ‘nearest’ qui renverra le point de donnée le plus proche :

lat = 43.2333
lon = 0.0833
da_Tarbes = da.sel(latitude = lat,
longitude = lon,
method = 'nearest',
drop = True)

drop = True permet de supprimer les coordonnées latitude, longitude devenues inutiles. Par défaut, ces coordonnées serait conservées avec une seule valeur : 43.2 pour la latitude et 0.1 pour la longitude.

On obtient ainsi un DataArray contenant la température en degrés Celcius à Tarbes pour chaque heure entre 1981 et 2010.

Reprenons tous ça dans une fonction, cela nous simplifiera certainement la vie plus tard :

On retrouve notre série de températures tarbaises avec :

lat = 43.2333
lon = 0.0833
da_Tarbes = temperature_horaire(lat, lon)

Pour obtenir la normale annuelle, il nous suffit de prendre la moyenne de ce DataArray :

da_Tarbes.mean()

Le résultat est encore sous la forme d’un DataArray, ce qui oblige à quelques détours pour obtenir un flottant que l’on va, conformément aux recommandations de l’OMM, arrondir au dixième :

da_Tarbes_normale = da_Tarbes.mean()
normale = round(float(da_Tarbes_normale.values), 1)

On obtient finalement la normale 1981–2010 pour la température annuelle : 11.6°C.

Calcul des normales mensuelles

Une moyenne annuelle, c’est bien mais cela n’aide pas vraiment à savoir si la température du 21 juillet 2020 est ou non normale… Pour cela, une normale mensuelle serait plus utile.

Rien de très compliqué. Reprenons notre DataArray horaire :

lat = 43.2333
lon = 0.0833
dossier = "ERA5Land_Temperature"
da_Tarbes = temperature_horaire(lat, lon, dossier)

On n’a pas vraiment besoin de températures horaires. Commençons donc par rééchantilloner avec un pas de temps quotidien :

da_Tarbes_j = da_Tarbes.resample(time = '1D').mean()

Il suffit ensuite de regrouper par mois de prendre la moyenne :

da_Tarbes_normales_m = da_Tarbes_j.groupby(‘time.month’).mean()

On peut accéder aux valeurs comme précédemment avec .values et voir que la normale pour juillet est de 19.0°C, mais ces résultats seront plus faciles à comprendre sur un graphique :

Et le tour est joué :

C’est simple, non ?

Allons un peu plus loin…

Il est possible de pousser un peu plus loin l’analyse avec, par exemple, une étude des quantiles ou un graphique “boite à moustache” :

Le code pour réaliser ce graphique est le suivant :

Ce graphique nous dit que la médiane de température moyenne journalière en juillet à Tarbes est de 18.9°C avec un troisième quartile à 21.1°C et un maximum à 27.3°C. Autrement dit la moitié des journées de juillet entre 1981 et 2010 ont connu une une température moyenne supérieure à 18.9°C, un quart une température supérieure à 21.1°C et aucune n’a dépassé 27.3°C.

Nous sommes désormais bien équipés pour savoir si la température du jour est exceptionnelle ou non.

Conclusion

Une dernière remarque s’impose pour conclure. Un des intérêts de ce calcul est qu’une normale a une certaine valeur prédictive : si vous exercez une activité sensible à la chaleur à Tarbes, vous avez maintenant une bonne base pour construire des hypothèses de températures réalistes.

Selon le guide de l’OMM cité plus haut : les normales “servent à déterminer implicitement les conditions auxquelles on peut le plus vraisemblablement s’attendre prochainement en un lieu donné.”

Il y a deux limites : premièrement, ce n’est pas parce qu’un phénomène météorologique ne s’est pas produit en 30 ans qu’il ne se produira pas demain : une journée à 28°C ou 29°C en juillet à Tarbes, c’est certainement peu probable mais ce n’est pas pour autant impossible, même dans un climat stationnaire. Si les enjeux sont importants, une analyse statistique plus poussée est indispensable.

Deuxièmement, le climat change rapidement sous l’effet de nos émissions de gaz à effet de serre. Une normale 1981–2010 ne reflète pas nécessairement le climat de 2020 et certainement pas celui de 2050. Pour les projets qui ont une durée de vie longue, projets immobiliers ou infrastructures par exemple, les hypothèses climatiques ne devraient pas s’appuyer sur des moyennes passées. Dans ces contextes, les projections climatiques sont utiles pour fournir une image du climat futur ou au moins pour évaluer les incertitudes.

C’est un sujet que nous avons déjà abordé dans un précédent tutoriel et sur lequel nous proposons de nombreuses études de cas.

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.

--

--

Callendar
Callendar

Written by Callendar

Start-up spécialisée dans l’exploitation des données climatiques, Callendar vous aide à prendre les bonnes décisions partout où le climat actuel et futur compte

No responses yet