| Spatial domain | Global |
| Spatial resolution | 0.25 degrees (~20km) |
| Time domain | Forecasts initialized 2024-04-01 00:00:00 UTC to Present |
| Time resolution | Forecasts initialized every 6 hours |
| Forecast domain | Forecast lead time 0-360 hours (0-15 days) ahead |
| Forecast resolution | 6 hourly |
STAC (browse) · validation report
The Artificial Intelligence Forecasting System (AIFS) is a data driven forecast model developed by the European Centre for Medium-Range Weather Forecasts (ECMWF). This is the non-ensemble configuration of AIFS that produces a single forecast trace. AIFS is trained on ECMWF's ERA5 re-analysis and ECMWF's operational numerical weather prediction (NWP) analyses.
This dataset is an archive of past and present ECMWF AIFS Single forecasts, optimized for spatial (map) access patterns. Forecasts are identified by an initialization time (init_time) denoting the start time of the model run, and step forward along the lead_time dimension from 0 to 360 hours (15 days) at a 6 hourly step.
Chunks reference the bytes of ECMWF's original GRIB files and are decoded on read, so this archive carries every variable ECMWF publishes for AIFS Single. Surface and single-level variables are at the dataset root; variables carried on pressure levels are in the pressure_level group.
Note: dynamical-catalog>=0.8.0 (or zarr>=3.2 icechunk>=2.0 gribberish>=1.5) is required.
| Quickstart (Github) | |
| Quickstart (Colab) |
import dynamical_catalog # dynamical-catalog>=0.8.0
ds = dynamical_catalog.open("ecmwf-aifs-single-forecast-virtual", chunks=None)
ds["temperature_2m"].sel(init_time="2026-03-01T00", lead_time="24h")
# Variables with a vertical dimension live in the pressure_level group
ds_pressure = dynamical_catalog.open("ecmwf-aifs-single-forecast-virtual", group="pressure_level", chunks=None)
ds_pressure["geopotential_height"].sel(pressure_level=500)
import icechunk
import pystac
import xarray as xr
catalog = pystac.Catalog.from_file("https://stac.dynamical.org/catalog.json")
collection = catalog.get_child("ecmwf-aifs-single-forecast-virtual")
asset = collection.assets["icechunk-https"]
authorize = icechunk.containers_credentials({"s3://ecmwf-forecasts/": icechunk.s3_anonymous_credentials()})
repo = icechunk.Repository.open(
icechunk.http_storage(asset.href),
authorize_virtual_chunk_access=authorize,
)
session = repo.readonly_session("main")
ds = xr.open_zarr(session.store, chunks=None)
ds["temperature_2m"].sel(init_time="2026-03-01T00", lead_time="24h")
# Variables with a vertical dimension live in the pressure_level group
ds_pressure = xr.open_zarr(session.store, group="pressure_level", chunks=None)
ds_pressure["geopotential_height"].sel(pressure_level=500)
| min | max | units | |
|---|---|---|---|
| init_time | 2024-04-01T00:00:00Z | Present | seconds since 1970-01-01 |
| latitude | -90 | 90 | degree_north |
| lead_time | 0 | 1296000 | seconds |
| longitude | -180 | 179.75 | degree_east |
| pressure_level | 10 | 1000 | hPa |
Access a variable by its name (the bold identifier, e.g. ds["convective_precipitation_run_total_surface"]).
Dimensions: init_time × lead_time × latitude × longitude
| variable | units |
|---|---|
convective_precipitation_run_total_surface
Convective precipitation (cp)
|
kg m-2 |
dew_point_temperature_2m
2 metre dewpoint temperature (2d)
|
degree_Celsius |
downward_long_wave_radiation_run_total_surface
Surface long-wave (thermal) radiation downwards (strd)
|
W s m-2 |
downward_short_wave_radiation_run_total_surface
Surface short-wave (solar) radiation downwards (ssrd)
|
W s m-2 |
geopotential_height_surface
Geopotential height (gh)Surface (orography) geopotential height. Time-invariant field published at lead time 0 only.
|
m |
high_cloud_cover
High cloud cover (hcc)
|
percent |
land_sea_mask_surface
Land-sea mask (lsm)Fraction (0-1) of the grid box that is land. Time-invariant field published at lead time 0 only.
|
1 |
low_cloud_cover
Low cloud cover (lcc)
|
percent |
medium_cloud_cover
Medium cloud cover (mcc)
|
percent |
pressure_reduced_to_mean_sea_level
Pressure reduced to MSL (prmsl)
|
Pa |
pressure_surface
Surface pressure (sp)
|
Pa |
runoff_water_equivalent_run_total_surface
Runoff water equivalent (surface plus subsurface) (rowe)Applies over land only. Water points are NaN from init time 2026-05-12T06:00 and unmasked before it.
|
kg m-2 |
skin_temperature_surface
Skin temperature (skt)
|
degree_Celsius |
slope_of_sub_gridscale_orography_surface
Slope of sub-gridscale orography (slor)Time-invariant field published at lead time 0 only.
|
1 |
snow_area_fraction_surface
Snow cover (snowc)Fraction (0-1) of the grid box covered by snow. Applies over land only; NaN over water.
|
1 |
snowfall_water_equivalent_run_total_surface
Snowfall water equivalent (sf)
|
kg m-2 |
soil_temperature_layer_1
Soil temperature (sot)ECMWF soil level 1, the uppermost soil layer. Over water this is the sea surface temperature, not a soil temperature.
|
degree_Celsius |
soil_temperature_layer_2
Soil temperature (sot)ECMWF soil level 2, the second soil layer from the surface. Over water this is the sea surface temperature, not a soil temperature.
|
degree_Celsius |
standard_deviation_of_sub_gridscale_orography_surface
Standard deviation of sub-gridscale orography (sdor)Time-invariant field published at lead time 0 only.
|
m |
temperature_2m
2 metre temperature (2t)
|
degree_Celsius |
total_cloud_cover_atmosphere
Total cloud cover (tcc)
|
percent |
total_column_water_atmosphere
Total column water (tcw)
|
kg m-2 |
total_precipitation_run_total_surface
Total precipitation (tp)
|
kg m-2 |
volumetric_soil_moisture_layer_1
Volumetric soil moisture (vsw)ECMWF soil level 1, the uppermost soil layer. Applies over land only. Water points are NaN from init time 2026-05-12T06:00 and unmasked before it.
|
1 |
volumetric_soil_moisture_layer_2
Volumetric soil moisture (vsw)ECMWF soil level 2, the second soil layer from the surface. Applies over land only. Water points are NaN from init time 2026-05-12T06:00 and unmasked before it.
|
1 |
wind_u_100m
100 metre U wind component (100u)
|
m s-1 |
wind_u_10m
10 metre U wind component (10u)
|
m s-1 |
wind_v_100m
100 metre V wind component (100v)
|
m s-1 |
wind_v_10m
10 metre V wind component (10v)
|
m s-1 |
These variables live in the pressure_level Zarr group (e.g. pass group="pressure_level" to dynamical_catalog.open() or xr.open_zarr()).
Dimensions: init_time × lead_time × latitude × longitude × pressure_level
| variable | units |
|---|---|
geopotential_height
Geopotential height (gh)
|
m |
specific_humidity
Specific humidity (q)The source provides no 10 hPa level for this variable; that level is always NaN.
|
1 |
temperature
Temperature (t)
|
degree_Celsius |
vertical_velocity
Vertical velocity (w)
|
Pa s-1 |
wind_u
U component of wind (u)
|
m s-1 |
wind_v
V component of wind (v)
|
m s-1 |
Dataset licensed under CC BY 4.0 and ECMWF Terms of Use.
ECMWF AIFS Single forecast data processed by dynamical.org from ECMWF Open Data.
Or ECMWF AIFS Single from dynamical.org.
The source grib files this archive is constructed from are provided by ECMWF Open Data and accessed from the AWS Open Data Registry.
ECMWF does not provide user support for the free & open datasets. Users should refer to the public User Forum for any questions related to the source material.
AIFS is updated regularly. Find details of recent and upcoming changes to the forecasting system on the ECMWF website.
Storage for this dataset is generously provided by AWS Open Data.
This dataset is stored in Zarr format, which splits each variable into a grid of chunks — the smallest unit read from storage. When possible, aligning your reads with this dataset's chunk grid can significantly improve data access speed.
The element count and coordinate span of this dataset:
| dimension | chunk |
|---|---|
| init_time | 1 (6 hours) |
| lead_time | 1 (6 hours) |
| latitude | 721 (180.25°) |
| longitude | 1440 (360°) |
| uncompressed | 7.9 MiB |
Review the validation report to understand variable availability, missing data, known quirks, fill values, and approximate spatial, temporal, and value distributions.
The data values in this dataset have been rounded in their binary floating point representation to improve compression. See Klöwer et al. 2021 for more information on this approach. The exact number of rounded bits can be found in our reformatting code.