The Planetary Computer includes a vast amount of ECMWF open data available via Azure Storage.
The earthkit and ecmwf-opendata package¶
When using the ecmwf-opendata Python library, we set source to azure and data hosted on Microsoft’s Azure should be accessed.
If the packages are not installed yet, uncomment the code below and run it.
# !pip3 install ecmwf-opendata earthkit-data earthkitfrom ecmwf.opendata import Client
import earthkit.data as ekd
client = Client(source="azure")
request = {
    "date": "2025-08-08 12:00:00",
    "time": 12,
    "type": "fc",
    "step": 0,
    "param": "2t",
}
client.retrieve(request, "azure_2t_data.grib2")
dm_2t = ekd.from_source("file", "azure_2t_data.grib2")
dm_2t.ls()client = Client(source="https://ai4edataeuwest.blob.core.windows.net/ecmwf/20250625/12z/ifs/0p25/oper/20250625120000-0h-oper-fc.grib2?st=2025-07-01T09%3A54%3A00Z&se=2025-07-02T10%3A39%3A00Z&sp=rl&sv=2024-05-04&sr=c&skoid=9c8ff44a-6a2c-4dfb-b298-1c9212f64d9a&sktid=72f988bf-86f1-41af-91ab-2d7cd011db47&skt=2025-07-02T02%3A32%3A03Z&ske=2025-07-09T02%3A32%3A03Z&sks=b&skv=2024-05-04&sig=qcG7eWdtC7/lhamMO1x8UwyA8A45tGFXAE55Xu5UQKg%3D")
request = {
    "date": "2025-06-25 12:00:00",
    "time": 12,
    "type": "fc",
    "step": 0,
    "stream": "oper",
    "param": "2t",
}
client.retrieve(request, "azure_2t_data.grib2")
dm_2t = ekd.from_source("file", "azure_2t_data.grib2")
dm_2t.ls()ds = earthkit.data.from_source(
    "ecmwf-open-data",
    source="https://ai4edataeuwest.blob.core.windows.net/ecmwf/20250625/12z/ifs/0p25/oper/20250625120000-0h-oper-fc.grib2?st=2025-07-01T09%3A54%3A00Z&se=2025-07-02T10%3A39%3A00Z&sp=rl&sv=2024-05-04&sr=c&skoid=9c8ff44a-6a2c-4dfb-b298-1c9212f64d9a&sktid=72f988bf-86f1-41af-91ab-2d7cd011db47&skt=2025-07-02T02%3A32%3A03Z&ske=2025-07-09T02%3A32%3A03Z&sks=b&skv=2024-05-04&sig=qcG7eWdtC7/lhamMO1x8UwyA8A45tGFXAE55Xu5UQKg%3D",
    model="ifs",
    date="20250625",
    time=12,
    stream="oper",
    type="fc",
    target="azure_2t_data.grib2",
)
ds.ls()The pystac_client and planetary_computer package¶
The example below shows how to download yesterday’s data.
!pip3 install pystac_client planetary_computer
!pip3 install xarray cfgribimport pystac_client
import planetary_computer
import requests
import xarray as xr
catalog = pystac_client.Client.open(
    "https://planetarycomputer.microsoft.com/api/stac/v1",
    modifier=planetary_computer.sign_inplace,
)
search = catalog.search(
    collections=["ecmwf-forecast"],
    query={
        "ecmwf:stream": {"eq": "oper"},
        "ecmwf:type": {"eq": "fc"},
        "ecmwf:step": {"eq": "0h"},
    },
)
items = search.item_collection()
# select the most recent item
item = max(items, key=lambda item: item.datetime)
url = item.assets["data"].href
url_ecmwf = url.rpartition('?')[0]
filename = str(url_ecmwf.rpartition('oper/')[-1])
r = requests.get(url, stream=True)
with open(filename, mode="wb") as file:
    for chunk in r.iter_content(chunk_size=10 * 1024):
        file.write(chunk)
ds = xr.open_dataset(f'./{filename}', engine='cfgrib',
                     decode_timedelta=True,
                     backend_kwargs={'filter_by_keys': {'typeOfLevel': 'soilLayer'}})
dsLoading...
Retrieve data for the date range of your interest
import pystac_client
import planetary_computer
import requests
import earthkit.data as ekd
catalog = pystac_client.Client.open(
    "https://planetarycomputer.microsoft.com/api/stac/v1",
    modifier=planetary_computer.sign_inplace,
)
# specify a date range
time_range = "2025-06-01/2025-06-01"
search = catalog.search(
    collections=["ecmwf-forecast"],
    query={
        "ecmwf:stream": {"eq": "oper"},
        "ecmwf:type": {"eq": "fc"},
        "ecmwf:step": {"eq": "0h"},
        },
    datetime=time_range)
items = search.item_collection()
list_of_files = []
for item in items:
    url = item.assets["data"].href
    url_ecmwf = url.rpartition('?')[0]
    filename = str(url_ecmwf.rpartition('oper/')[-1])
    
    r = requests.get(url, stream=True)
    with open(filename, mode="wb") as file:
        for chunk in r.iter_content(chunk_size=10 * 1024):
            file.write(chunk)
    list_of_files.append(filename)
for file_ in list_of_files:
    print(f'File: {file_}')
    ds = ekd.from_source("file", f'./{file_}')
    ds.ls()