Manipuler les prévision météorologiques avec Python#

Debut 2024, Météo France à ouvert toutes ses données météorologiques au public, incluant les observations et les prévisions.

Ces données sont disponibles via une API REST ainsi que sous forme de fichier sur le site meteo.data.gouv.fr.

Dans ce tutoriel, nous allons voir comment manipuler les fichiers de prévision météo.

Le format des fichiers#

Les données météo sont généralement diffusées dans le format GRIB. C’est un format Binaire qui permet de stocker plusieurs champs de valeurs sur une même grille latitude/longitude/altitude/temps.

Chaque model météo (ARPEGE, AROME, ICON, etc.) ont plusieurs résolutions de grilles, de 0.1° à 0.025°. Pour chaque résolution, les informations diffusées sont différentes.

Nous utiliserons ici les données de AROME à la résolution de 0.025°.

Meteo France diffuse les prévisions avec plusieurs fichiers afin de réduire la taille de chacun d’entre eux. La documentation exhaustive est disponnible ici mais en voici les principaux :

  • Champs de surfaces

    • SP1 : inclue le vent a 10m d’haltitude (direction, vitesse, composantes \(U\) et \(V\)), le flux solaire vertical, la précipitation, etc.

    • SP2 : inclue la temperature au sol, la nebulositée, les valeurs min et max de la temperature à 2m

    • SP3 : inclue le flux thermique vertical, le flux solair total

  • champs isobares

    • IP1 à IP5 avec les champs de temperature, humiditée, etc. sur les surfaces isobares de 100 à 1000hPa

  • Champs de hauteurs

    • HP1 a HP3 avec la temperature, humiditée, vent, etc. sur 24 niveaux, de 20m à 3000m

Il faut donc, pour chaque champs désirer, choisir le bon fichier à récupérer et ouvire.

Dans se tutoriel, nous nous intéresserons à la vitesse du vent et au flux solaire vertical, donc nous utiliserons le fichier SP1.

Récupérer le fichier#

Les fichiers sont téléchargeables sur le site meteo.data.gouv.fr. Il y a un fichier par horizon de prévision (de 1h à 42h) et par date à laquel la prévision a été faite. Les fichiers sont donc nommés de la manière suivante :

arome__0025__HP1__00H06H__2024-05-21T03:00:00Z.grib2
~~~~~  ~~~~  ~~~  ~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  |     |     |     |                   |
  |     |     |     |                   +-- Date à laquel la prévision a été calculée
  |     |     |     +-- Horizon de la prévision
  |     |     +-- Type de champs
  |     +-- Résolution de la grille
  +-- Model

A la date de rédaction de ce tutoriel, le 21 mai 2024, le fichier pour l’horizon 0h et la date 2024-05-21 03:00 est disponible ici.

[1]:
import requests
url = "https://object.data.gouv.fr/meteofrance-pnt/pnt/2024-05-21T03:00:00Z/arome/0025/SP1/arome__0025__SP1__00H06H__2024-05-21T03:00:00Z.grib2"
filename = "arome_sp1_oh.grib2"
[2]:
r = requests.get(url, stream=True)
with open(filename, "wb") as f:
    for chunk in r.iter_content(chunk_size=1024):
        if chunk:
            f.write(chunk)

Lire le fichier#

Pour lire le fichier GRIB, nous utiliserons la librairie cfgrib. Celle-ci est intégrée à xarray et permet de lire les fichiers GRIB directement.

Il vous faudra installer les modules

conda install -c conda-forge xarray cfgrib
[2]:
import xarray as xr

ds = xr.open_dataset(filename, engine="cfgrib")
/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/gribapi/__init__.py:23: UserWarning: ecCodes 2.31.0 or higher is recommended. You are running version 2.24.2
  warnings.warn(
skipping variable: paramId==260065 shortName='gust'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
skipping variable: paramId==228228 shortName='tp'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
skipping variable: paramId==260646 shortName='efg10'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
skipping variable: paramId==260647 shortName='nfg10'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
---------------------------------------------------------------------------
DatasetBuildError                         Traceback (most recent call last)
File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py:673, in build_dataset_components(index, errors, encode_cf, squeeze, log, read_keys, time_dims, extra_coords, cache_geo_coords)
    672 try:
--> 673     dims, data_var, coord_vars = build_variable_components(
    674         var_index,
    675         encode_cf,
    676         filter_by_keys,
    677         errors=errors,
    678         squeeze=squeeze,
    679         read_keys=read_keys,
    680         time_dims=time_dims,
    681         extra_coords=extra_coords,
    682         cache_geo_coords=cache_geo_coords,
    683     )
    684 except DatasetBuildError as ex:
    685     # NOTE: When a variable has more than one value for an attribute we need to raise all
    686     #   the values in the file, not just the ones associated with that variable. See #54.

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py:495, in build_variable_components(index, encode_cf, filter_by_keys, log, errors, squeeze, read_keys, time_dims, extra_coords, cache_geo_coords)
    483 def build_variable_components(
    484     index: abc.Index[T.Any, abc.Field],
    485     encode_cf: T.Sequence[str] = (),
   (...)
    493     cache_geo_coords: bool = True,
    494 ) -> T.Tuple[T.Dict[str, int], Variable, T.Dict[str, Variable]]:
--> 495     data_var_attrs = enforce_unique_attributes(index, DATA_ATTRIBUTES_KEYS, filter_by_keys)
    496     grid_type_keys = GRID_TYPE_MAP.get(index.getone("gridType"), [])

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py:283, in enforce_unique_attributes(index, attributes_keys, filter_by_keys)
    282         fbks.append(fbk)
--> 283     raise DatasetBuildError("multiple values for key %r" % key, key, fbks)
    284 if values and values[0] not in ("undef", "unknown"):

DatasetBuildError: multiple values for key 'stepType'

During handling of the above exception, another exception occurred:

DatasetBuildError                         Traceback (most recent call last)
Cell In[2], line 3
      1 import xarray as xr
----> 3 ds = xr.open_dataset(filename, engine="cfgrib")

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/xarray/backends/api.py:571, in open_dataset(filename_or_obj, engine, chunks, cache, decode_cf, mask_and_scale, decode_times, decode_timedelta, use_cftime, concat_characters, decode_coords, drop_variables, inline_array, chunked_array_type, from_array_kwargs, backend_kwargs, **kwargs)
    559 decoders = _resolve_decoders_kwargs(
    560     decode_cf,
    561     open_backend_dataset_parameters=backend.open_dataset_parameters,
   (...)
    567     decode_coords=decode_coords,
    568 )
    570 overwrite_encoded_chunks = kwargs.pop("overwrite_encoded_chunks", None)
--> 571 backend_ds = backend.open_dataset(
    572     filename_or_obj,
    573     drop_variables=drop_variables,
    574     **decoders,
    575     **kwargs,
    576 )
    577 ds = _dataset_from_backend_dataset(
    578     backend_ds,
    579     filename_or_obj,
   (...)
    589     **kwargs,
    590 )
    591 return ds

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/xarray_plugin.py:109, in CfGribBackend.open_dataset(self, filename_or_obj, mask_and_scale, decode_times, concat_characters, decode_coords, drop_variables, use_cftime, decode_timedelta, lock, indexpath, filter_by_keys, read_keys, encode_cf, squeeze, time_dims, errors, extra_coords, cache_geo_coords)
     87 def open_dataset(
     88     self,
     89     filename_or_obj: T.Union[str, abc.MappingFieldset[T.Any, abc.Field]],
   (...)
    107     cache_geo_coords: bool = True,
    108 ) -> xr.Dataset:
--> 109     store = CfGribDataStore(
    110         filename_or_obj,
    111         indexpath=indexpath,
    112         filter_by_keys=filter_by_keys,
    113         read_keys=read_keys,
    114         encode_cf=encode_cf,
    115         squeeze=squeeze,
    116         time_dims=time_dims,
    117         lock=lock,
    118         errors=errors,
    119         extra_coords=extra_coords,
    120         cache_geo_coords=cache_geo_coords,
    121     )
    122     with xr.core.utils.close_on_error(store):
    123         vars, attrs = store.load()  # type: ignore

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/xarray_plugin.py:40, in CfGribDataStore.__init__(self, filename, lock, **backend_kwargs)
     38 else:
     39     opener = dataset.open_fieldset
---> 40 self.ds = opener(filename, **backend_kwargs)

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py:800, in open_file(path, errors, indexpath, filter_by_keys, read_keys, time_dims, extra_coords, **kwargs)
    797 index_keys = compute_index_keys(time_dims, extra_coords)
    798 index = open_fileindex(stream, indexpath, index_keys, filter_by_keys=filter_by_keys)
--> 800 return open_from_index(index, read_keys, time_dims, extra_coords, errors=errors, **kwargs)

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py:743, in open_from_index(index, read_keys, time_dims, extra_coords, **kwargs)
    736 def open_from_index(
    737     index: abc.Index[T.Any, abc.Field],
    738     read_keys: T.Sequence[str] = (),
   (...)
    741     **kwargs: T.Any,
    742 ) -> Dataset:
--> 743     dimensions, variables, attributes, encoding = build_dataset_components(
    744         index, read_keys=read_keys, time_dims=time_dims, extra_coords=extra_coords, **kwargs
    745     )
    746     return Dataset(dimensions, variables, attributes, encoding)

File ~/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py:695, in build_dataset_components(index, errors, encode_cf, squeeze, log, read_keys, time_dims, extra_coords, cache_geo_coords)
    693         fbks.append(fbk)
    694         error_message += "\n    filter_by_keys=%r" % fbk
--> 695     raise DatasetBuildError(error_message, key, fbks)
    696 short_name = data_var.attributes.get("GRIB_shortName", "paramId_%d" % param_id)
    697 var_name = data_var.attributes.get("GRIB_cfVarName", "unknown")

DatasetBuildError: multiple values for unique key, try re-open the file with one of:
    filter_by_keys={'stepType': 'instant'}
    filter_by_keys={'stepType': 'max'}
    filter_by_keys={'stepType': 'accum'}

La fonction échoue. Comme l’indique le message d’erreur, c’est dû au fait que plusieurs variables sont fournit avec plusieurs type de valeure :

  • la valeur instantané

  • la valeur maximum

  • la valeur accumulée

[3]:
ds = xr.open_dataset(filename, engine="cfgrib", backend_kwargs={"filter_by_keys": {'stepType': 'instant'}})
ds
skipping variable: paramId==0 shortName='unknown'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
skipping variable: paramId==167 shortName='t2m'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='heightAboveGround' value=Variable(dimensions=(), data=10.0) new_value=Variable(dimensions=(), data=2.0)
skipping variable: paramId==260242 shortName='r2'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='heightAboveGround' value=Variable(dimensions=(), data=10.0) new_value=Variable(dimensions=(), data=2.0)
[3]:
<xarray.Dataset> Size: 113MB
Dimensions:            (step: 7, latitude: 717, longitude: 1121)
Coordinates:
    time               datetime64[ns] 8B ...
  * step               (step) timedelta64[ns] 56B 00:00:00 01:00:00 ... 06:00:00
    heightAboveGround  float64 8B ...
  * latitude           (latitude) float64 6kB 55.4 55.38 55.35 ... 37.53 37.5
  * longitude          (longitude) float64 9kB -12.0 -11.97 ... 15.98 16.0
    valid_time         (step) datetime64[ns] 56B ...
    meanSea            float64 8B ...
Data variables:
    wdir10             (step, latitude, longitude) float32 23MB ...
    si10               (step, latitude, longitude) float32 23MB ...
    u10                (step, latitude, longitude) float32 23MB ...
    v10                (step, latitude, longitude) float32 23MB ...
    prmsl              (step, latitude, longitude) float32 23MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
    history:                 2024-05-21T12:01 GRIB to CDM+CF via cfgrib-0.9.1...

Premières difficultées#

Comme vous pouvez le voir lors de l’étapes précédente :

  • un DataSet Xarray a bien été retournée

  • ce DataSet ne présente que 5 variables concernant principalement les parameters du vent à 10m. Vous pouvez utiliser la sortie de la cellule précédentes pour inspecter les attributes et les méta-données des coordinée et des variables.

  • plusieurs messages d’erreurs indiquent des incompatibilitées entre la valeure de l’altitude ainsi que pour les valeures.

Solution#

La solution pour corriger ce problème est de filter les variables concaténé en DataSet. On pourra

  1. Selectionner une variable directement

  2. Filtrer sur le champ de l’altitude

1. Selection de la variable#

Cette methode est la plus simple, mais necessite de connaitre le nom de la variable.

[4]:
ds_u10 = xr.open_dataset(filename, engine="cfgrib", backend_kwargs={"filter_by_keys": {"shortName": "10u"}})
ds_u10
[4]:
<xarray.Dataset> Size: 23MB
Dimensions:            (step: 7, latitude: 717, longitude: 1121)
Coordinates:
    time               datetime64[ns] 8B ...
  * step               (step) timedelta64[ns] 56B 00:00:00 01:00:00 ... 06:00:00
    heightAboveGround  float64 8B ...
  * latitude           (latitude) float64 6kB 55.4 55.38 55.35 ... 37.53 37.5
  * longitude          (longitude) float64 9kB -12.0 -11.97 ... 15.98 16.0
    valid_time         (step) datetime64[ns] 56B ...
Data variables:
    u10                (step, latitude, longitude) float32 23MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
    history:                 2024-05-21T12:01 GRIB to CDM+CF via cfgrib-0.9.1...

2. Filtrer par altitude#

Cette methode permet de selectionner les variables qui sont a la même altitude.

[6]:
ds_surface = xr.open_dataset(filename, engine="cfgrib", backend_kwargs={"filter_by_keys": {'stepType': 'accum', "typeOfLevel": "surface"}})
ds_surface
[6]:
<xarray.Dataset> Size: 77MB
Dimensions:     (step: 6, latitude: 717, longitude: 1121)
Coordinates:
    time        datetime64[ns] 8B ...
  * step        (step) timedelta64[ns] 48B 01:00:00 02:00:00 ... 06:00:00
    surface     float64 8B ...
  * latitude    (latitude) float64 6kB 55.4 55.38 55.35 ... 37.55 37.53 37.5
  * longitude   (longitude) float64 9kB -12.0 -11.97 -11.95 ... 15.95 15.98 16.0
    valid_time  (step) datetime64[ns] 48B ...
Data variables:
    tp          (step, latitude, longitude) float32 19MB ...
    sprate      (step, latitude, longitude) float32 19MB ...
    ssrd        (step, latitude, longitude) float32 19MB ...
    unknown     (step, latitude, longitude) float32 19MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
    history:                 2024-05-21T12:01 GRIB to CDM+CF via cfgrib-0.9.1...
[7]:
ds_2m = xr.open_dataset(filename, engine="cfgrib", backend_kwargs={"filter_by_keys": {"typeOfLevel": "heightAboveGround", "level": 2}})
ds_2m

[7]:
<xarray.Dataset> Size: 45MB
Dimensions:            (step: 7, latitude: 717, longitude: 1121)
Coordinates:
    time               datetime64[ns] 8B ...
  * step               (step) timedelta64[ns] 56B 00:00:00 01:00:00 ... 06:00:00
    heightAboveGround  float64 8B ...
  * latitude           (latitude) float64 6kB 55.4 55.38 55.35 ... 37.53 37.5
  * longitude          (longitude) float64 9kB -12.0 -11.97 ... 15.98 16.0
    valid_time         (step) datetime64[ns] 56B ...
Data variables:
    t2m                (step, latitude, longitude) float32 23MB ...
    r2                 (step, latitude, longitude) float32 23MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
    history:                 2024-05-21T12:01 GRIB to CDM+CF via cfgrib-0.9.1...
[8]:
ds_10m = xr.open_dataset(filename, engine="cfgrib", backend_kwargs={"read_keys": ["stepRange"],
                                                                    "filter_by_keys": {
                                                                                      "typeOfLevel": "heightAboveGround",
                                                                                      "level": 10,
                                                                                       }
                                                                    })
ds_10m
skipping variable: paramId==260065 shortName='gust'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
skipping variable: paramId==260646 shortName='efg10'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
skipping variable: paramId==260647 shortName='nfg10'
Traceback (most recent call last):
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 701, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "/home/ubuntu/.local/share/hatch/env/virtual/antoinetavant-github-io/vsXjhu16/antoinetavant-github-io/lib/python3.10/site-packages/cfgrib/dataset.py", line 629, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='step' value=Variable(dimensions=('step',), data=array([0., 1., 2., 3., 4., 5., 6.])) new_value=Variable(dimensions=('step',), data=array([1., 2., 3., 4., 5., 6.]))
[8]:
<xarray.Dataset> Size: 90MB
Dimensions:            (step: 7, latitude: 717, longitude: 1121)
Coordinates:
    time               datetime64[ns] 8B ...
  * step               (step) timedelta64[ns] 56B 00:00:00 01:00:00 ... 06:00:00
    heightAboveGround  float64 8B ...
  * latitude           (latitude) float64 6kB 55.4 55.38 55.35 ... 37.53 37.5
  * longitude          (longitude) float64 9kB -12.0 -11.97 ... 15.98 16.0
    valid_time         (step) datetime64[ns] 56B ...
Data variables:
    wdir10             (step, latitude, longitude) float32 23MB ...
    si10               (step, latitude, longitude) float32 23MB ...
    u10                (step, latitude, longitude) float32 23MB ...
    v10                (step, latitude, longitude) float32 23MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
    history:                 2024-05-21T12:01 GRIB to CDM+CF via cfgrib-0.9.1...

Pour les variables à 10 m d’altitude, nous avons un nouvel message d’erreur. C’est du au fait que certaines variables sont fournies avec un horizon de 0h (ce qui correspond a la valeur initiale donc) et d’autres uniquement à partir de 1h d’horizon.

Actuellement, je n’ai pas réussi à filtrer sur ce parametre. Une solution est de laisser cfgrib determiner lui-même les differents groupes

[9]:
import cfgrib
list_dataset = cfgrib.open_datasets(filename)
print(f"number of datasets: {len(list_dataset)}")
number of datasets: 6
[10]:
for ds in list_dataset:
    display(ds)
<xarray.Dataset> Size: 90MB
Dimensions:            (step: 7, latitude: 717, longitude: 1121)
Coordinates:
    time               datetime64[ns] 8B 2024-05-21T03:00:00
  * step               (step) timedelta64[ns] 56B 00:00:00 01:00:00 ... 06:00:00
    heightAboveGround  float64 8B 10.0
  * latitude           (latitude) float64 6kB 55.4 55.38 55.35 ... 37.53 37.5
  * longitude          (longitude) float64 9kB -12.0 -11.97 ... 15.98 16.0
    valid_time         (step) datetime64[ns] 56B 2024-05-21T03:00:00 ... 2024...
Data variables:
    u10                (step, latitude, longitude) float32 23MB ...
    v10                (step, latitude, longitude) float32 23MB ...
    si10               (step, latitude, longitude) float32 23MB ...
    wdir10             (step, latitude, longitude) float32 23MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
<xarray.Dataset> Size: 45MB
Dimensions:            (step: 7, latitude: 717, longitude: 1121)
Coordinates:
    time               datetime64[ns] 8B 2024-05-21T03:00:00
  * step               (step) timedelta64[ns] 56B 00:00:00 01:00:00 ... 06:00:00
    heightAboveGround  float64 8B 2.0
  * latitude           (latitude) float64 6kB 55.4 55.38 55.35 ... 37.53 37.5
  * longitude          (longitude) float64 9kB -12.0 -11.97 ... 15.98 16.0
    valid_time         (step) datetime64[ns] 56B 2024-05-21T03:00:00 ... 2024...
Data variables:
    t2m                (step, latitude, longitude) float32 23MB ...
    r2                 (step, latitude, longitude) float32 23MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
<xarray.Dataset> Size: 58MB
Dimensions:            (step: 6, latitude: 717, longitude: 1121)
Coordinates:
    time               datetime64[ns] 8B 2024-05-21T03:00:00
  * step               (step) timedelta64[ns] 48B 01:00:00 02:00:00 ... 06:00:00
    heightAboveGround  float64 8B 10.0
  * latitude           (latitude) float64 6kB 55.4 55.38 55.35 ... 37.53 37.5
  * longitude          (longitude) float64 9kB -12.0 -11.97 ... 15.98 16.0
    valid_time         (step) datetime64[ns] 48B 2024-05-21T04:00:00 ... 2024...
Data variables:
    gust               (step, latitude, longitude) float32 19MB ...
    efg10              (step, latitude, longitude) float32 19MB ...
    nfg10              (step, latitude, longitude) float32 19MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
<xarray.Dataset> Size: 23MB
Dimensions:     (step: 7, latitude: 717, longitude: 1121)
Coordinates:
    time        datetime64[ns] 8B 2024-05-21T03:00:00
  * step        (step) timedelta64[ns] 56B 00:00:00 01:00:00 ... 06:00:00
    meanSea     float64 8B 0.0
  * latitude    (latitude) float64 6kB 55.4 55.38 55.35 ... 37.55 37.53 37.5
  * longitude   (longitude) float64 9kB -12.0 -11.97 -11.95 ... 15.95 15.98 16.0
    valid_time  (step) datetime64[ns] 56B ...
Data variables:
    prmsl       (step, latitude, longitude) float32 23MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
<xarray.Dataset> Size: 77MB
Dimensions:     (step: 6, latitude: 717, longitude: 1121)
Coordinates:
    time        datetime64[ns] 8B 2024-05-21T03:00:00
  * step        (step) timedelta64[ns] 48B 01:00:00 02:00:00 ... 06:00:00
    surface     float64 8B 0.0
  * latitude    (latitude) float64 6kB 55.4 55.38 55.35 ... 37.55 37.53 37.5
  * longitude   (longitude) float64 9kB -12.0 -11.97 -11.95 ... 15.95 15.98 16.0
    valid_time  (step) datetime64[ns] 48B 2024-05-21T04:00:00 ... 2024-05-21T...
Data variables:
    unknown     (step, latitude, longitude) float32 19MB nan nan nan ... nan nan
    ssrd        (step, latitude, longitude) float32 19MB ...
    tp          (step, latitude, longitude) float32 19MB ...
    sprate      (step, latitude, longitude) float32 19MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse
<xarray.Dataset> Size: 19MB
Dimensions:     (step: 6, latitude: 717, longitude: 1121)
Coordinates:
    time        datetime64[ns] 8B 2024-05-21T03:00:00
  * step        (step) timedelta64[ns] 48B 01:00:00 02:00:00 ... 06:00:00
    surface     float64 8B 0.0
  * latitude    (latitude) float64 6kB 55.4 55.38 55.35 ... 37.55 37.53 37.5
  * longitude   (longitude) float64 9kB -12.0 -11.97 -11.95 ... 15.95 15.98 16.0
    valid_time  (step) datetime64[ns] 48B 2024-05-21T04:00:00 ... 2024-05-21T...
Data variables:
    unknown     (step, latitude, longitude) float32 19MB nan nan nan ... nan nan
Attributes:
    GRIB_edition:            2
    GRIB_centre:             lfpw
    GRIB_centreDescription:  French Weather Service - Toulouse
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             French Weather Service - Toulouse

On retrouve alors les differents champs indiquées dans la documentations :

  1. Le premier dataset correspond aux variables à 10 m d’altitude avec 7 pas de temps, donc les parametres de vent : u10, v10, wdir10 et si10

  2. le deuxième dataset correspond aux variables à 2 m d’altitude avec 7 pas de temps, donc les parametres de temperature et humidité: t2m, r2m

  3. le troisième dataset correspond aux variables à 10 m d’altitude avec 6 pas de temps, donc les parametres de rafales de vent: gust, efg10, nfg10

  4. le quatrième dataset correspond aux variables à la surface de la mer avec 7 pas de temps, donc les parametres de pression au niveau de la mer: prmsl

  5. le cinquième dataset correspond aux variables à la surface du sol avec 7 pas de temps, donc les parametres de radiation solaire et de précipitation: ssrd, sprate, tp, et un Unknown qui n’est pas documenté

  6. le sixième dataset correspond aux variables à la surface du sol avec 6 pas de temps, mais il n’est pas documenté

A partir de la documentation, on peut en deduire que les 2 variables non documentées sont:

  • Graupel (précipitation dite de neige roulée)

  • Nebulosity (nuage)

Conclusion#

Nous avons vu comment lire un fichier de prévision météo fournies par Météo France.

Nous avons vu comment filtrer les variables pour ne garder que celles qui nous intéressent, en utilisant les paramètres de l’altitude.

Nous avons finalement vu comment laisser cfgrib déterminer lui-même les groupes de variables.

Les fichiers GRIB fournis par Météo France ne sont pas faciles à manipuler, en particulier à cause de la variété des indexes et des horizons de prévision toutes incluses dans un seul fichier. Nous verrons dans un prochain tutoriel comment utiliser l’API REST pour récupérer directement les variables qui nous intéressent.