| Spatial domain | Global |
| Spatial resolution | 1.5 degrees (~165km) |
| Time domain | Forecasts initialized 2023-06-28 00:00:00 UTC to Present |
| Time resolution | Forecasts initialized every 24 hours |
| Forecast domain | Forecast lead time 0-1104 hours (0-46 days) ahead |
| Forecast resolution | Forecast step 24 hourly |
The Integrated Forecasting System (IFS) is a global forecast model developed by ECMWF. ENS is an ensemble configuration of IFS, containing 51 ensemble members. IFS consists of a numerical model of the Earth system, which includes an atmospheric model at its heart, coupled with models of other Earth system components such as the ocean. The data assimilation system combines the latest weather observations with a recent forecast to obtain the best possible estimate of the current state of the Earth system.
This dataset is an archive of ECMWF IFS ENS sub-seasonal-range forecasts. Forecasts are identified by an initialization time (init_time) denoting the start time of the model run, as well as by the ensemble_member. Each forecast steps forward along the lead_time dimension from 0 to 1104 hours (0 to 46 days) at a 24 hourly step, and carries 101 ensemble members on a global 1.5 degree grid. This dataset contains the 00 UTC initialization times only.
Because the step is 24 hourly, most surface variables are daily means or rates rather than instantaneous values — hence the average_ prefixes. Surface and single-level variables are at the dataset root; the six variables carried on pressure levels are in the pressure_level group.
Note: ECMWF's licence holds sub-seasonal-range forecasts back for 48 hours, so this is not a real-time dataset — each initialization becomes available about two days after its init_time.
import dynamical_catalog # dynamical-catalog>=0.8.0
ds = dynamical_catalog.open("ecmwf-ifs-ens-forecast-46-day-1-5-degree", chunks=None)
ds["average_temperature_2m"].sel(init_time="2026-08-01T00", latitude=0, longitude=0).max()
import icechunk
import pystac
import xarray as xr
catalog = pystac.Catalog.from_file("https://stac.dynamical.org/catalog.json")
collection = catalog.get_child("ecmwf-ifs-ens-forecast-46-day-1-5-degree")
asset = collection.assets["icechunk-https"]
repo = icechunk.Repository.open(icechunk.http_storage(asset.href))
session = repo.readonly_session("main")
ds = xr.open_zarr(session.store, chunks=None)
ds["average_temperature_2m"].sel(init_time="2026-08-01T00", latitude=0, longitude=0).max()
import dynamical_catalog # dynamical-catalog>=0.8.0
ds_pressure = dynamical_catalog.open("ecmwf-ifs-ens-forecast-46-day-1-5-degree", group="pressure_level", chunks=None)
ds_pressure["geopotential_height"].sel(init_time="2026-08-01T00", lead_time="10d", pressure_level=500).std("ensemble_member")
import icechunk
import pystac
import xarray as xr
catalog = pystac.Catalog.from_file("https://stac.dynamical.org/catalog.json")
collection = catalog.get_child("ecmwf-ifs-ens-forecast-46-day-1-5-degree")
asset = collection.assets["icechunk-https"]
repo = icechunk.Repository.open(icechunk.http_storage(asset.href))
session = repo.readonly_session("main")
ds_pressure = xr.open_zarr(session.store, group="pressure_level", chunks=None)
ds_pressure["geopotential_height"].sel(init_time="2026-08-01T00", lead_time="10d", pressure_level=500).std("ensemble_member")
| min | max | units | |
|---|---|---|---|
| ensemble_member | 0 | 100 | 1 |
| init_time | 2023-06-28T00:00:00Z | Present | seconds since 1970-01-01 |
| latitude | -90 | 90 | degree_north |
| lead_time | 0 | 3974400 | seconds |
| longitude | -180 | 178.5 | degree_east |
| pressure_level | 10 | 1000 | hPa |
Access a variable by its name (the bold identifier, e.g. ds["average_dew_point_temperature_2m"]).
Dimensions: init_time × lead_time × ensemble_member × latitude × longitude
| variable | units |
|---|---|
average_dew_point_temperature_2m
Mean 2 metre dewpoint temperature in the last 24 hours (mn2d24)Mean 2 metre dewpoint temperature over the previous 24 hours.
|
degree_Celsius |
average_temperature_2m
Mean temperature at 2 metres in the last 24 hours (mean2t24)Mean temperature at 2 metres over the previous 24 hours.
|
degree_Celsius |
downward_latent_heat_flux_surface
Time-mean surface latent heat flux (mslhfl)Average surface downward latent heat flux over the previous 24 hours.
|
W m-2 |
downward_long_wave_radiation_flux_surface
Surface downward long-wave radiation flux (sdlwrf)Average surface downward long-wave radiation flux over the previous 24 hours.
|
W m-2 |
downward_sensible_heat_flux_surface
Time-mean surface sensible heat flux (msshfl)Average surface downward sensible heat flux over the previous 24 hours.
|
W m-2 |
downward_short_wave_radiation_flux_surface
Surface downward short-wave radiation flux (sdswrf)Average surface downward short-wave radiation flux over the previous 24 hours.
|
W m-2 |
eastward_turbulent_surface_stress
Time-mean eastward turbulent surface stress (avg_iews)Average eastward turbulent surface stress over the previous 24 hours.
|
Pa |
net_long_wave_radiation_flux_surface
Surface net long-wave radiation flux (snlwrf)Average surface net long-wave radiation flux over the previous 24 hours.
|
W m-2 |
net_long_wave_radiation_flux_top_of_atmosphere
Top net long-wave radiation flux (tnlwrf)Average top net long-wave radiation flux over the previous 24 hours.
|
W m-2 |
net_short_wave_radiation_flux_surface
Surface net short-wave radiation flux (snswrf)Average surface net short-wave radiation flux over the previous 24 hours.
|
W m-2 |
northward_turbulent_surface_stress
Time-mean northward turbulent surface stress (avg_inss)Average northward turbulent surface stress over the previous 24 hours.
|
Pa |
precipitation_convective_surface
Convective precipitation rate (cpr)Average convective precipitation rate over the previous 24 hours. Units equivalent to mm/s.
|
kg m-2 s-1 |
pressure_reduced_to_mean_sea_level
Pressure reduced to MSL (prmsl)
|
Pa |
pressure_surface
Surface pressure (sp)
|
Pa |
runoff_surface
Surface runoff rate (surfror)Average surface runoff rate over the previous 24 hours. Units equivalent to mm/s. Land points only; sea points are missing.
|
kg m-2 s-1 |
runoff_water_equivalent_surface
Runoff rate water equivalent (surface plus subsurface) (rorwe)Average runoff water equivalent rate (surface plus subsurface) over the previous 24 hours. Units equivalent to mm/s. Land points only; sea points are missing.
|
kg m-2 s-1 |
sea_ice_area_fraction
Sea ice area fraction (ci)Mean sea ice area fraction over the previous 24 hours. Sea points only; land points are missing.
|
1 |
sea_surface_temperature
Sea surface temperature (sst)Mean sea surface temperature over the previous 24 hours. Sea points only; land points are missing.
|
degree_Celsius |
skin_temperature_surface
Skin temperature (skt)Mean skin temperature over the previous 24 hours.
|
degree_Celsius |
snow_albedo_surface
Snow albedo (asn)Mean snow albedo over the previous 24 hours. Missing where the surface carries no snowpack, including snow-free land.
|
percent |
snow_density_surface
Snow density (rsn)Mean snow density over the previous 24 hours. Missing where the surface carries no snowpack, including snow-free land.
|
kg m-3 |
snow_water_equivalent_surface
Snow depth water equivalent (sd)Mean snow depth water equivalent over the previous 24 hours.
|
m |
snowfall_water_equivalent_rate_surface
Total snowfall rate water equivalent (tsrwe)Average snowfall water equivalent rate over the previous 24 hours. Units equivalent to mm/s.
|
kg m-2 s-1 |
soil_moisture_0_100cm
Soil moisture top 100 cm (sm100)Mean soil moisture 0-100 cm over the previous 24 hours. Land points only; sea points are missing.
|
kg m-3 |
soil_moisture_0_20cm
Soil moisture top 20 cm (sm20)Mean soil moisture 0-20 cm over the previous 24 hours. Land points only; sea points are missing.
|
kg m-3 |
soil_temperature_0_100cm
Soil temperature top 100 cm (st100)Mean soil temperature 0-100 cm over the previous 24 hours. Land points only; sea points are missing.
|
degree_Celsius |
soil_temperature_0_20cm
Soil temperature top 20 cm (st20)Mean soil temperature 0-20 cm over the previous 24 hours. Land points only; sea points are missing.
|
degree_Celsius |
total_cloud_cover_atmosphere
Total cloud cover (tcc)Mean total cloud cover over the previous 24 hours.
|
percent |
total_column_water_atmosphere
Total column water (tcw)Mean total column water over the previous 24 hours.
|
kg m-2 |
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 × ensemble_member × pressure_level × latitude × longitude
| variable | units |
|---|---|
geopotential_height
Geopotential height (gh)
|
m |
specific_humidity
Specific humidity (q)The source provides no 10, 50 or 100 hPa levels for this variable; those levels are 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 IFS ENS sub-seasonal-range forecast data processed by dynamical.org from the ECMWF Data Store.
Or ECMWF IFS ENS from dynamical.org.
This archive is built from the ECMWF sub-seasonal-range (S2S) forecast, retrieved from the ECMWF Data Store (ECDS) into the dynamical.org ECMWF IFS grib archive on Source Cooperative. ECDS serves retrieval jobs rather than addressable files, so the grib archive — not ECDS — is what this dataset is reformatted from.
ECMWF's licence holds sub-seasonal-range forecasts back for 48 hours, and ECDS publishes an initialization about 52 hours after its 00 UTC reference time. This is therefore not a real-time dataset: the most recent initialization available is about two days old.
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.
This dataset is under construction and is published to the staging catalog only.
The init_time axis declares 1153 daily initializations from 2023-06-28, but only the most
recent 30 — 2026-07-25T00 through 2026-08-23T00 UTC — hold data. Every earlier
initialization reads as NaN, and operational updates are currently paused, so the archive does
not yet extend to the present. The collection's temporal extent and its time_domain summary
describe the declared axis rather than this window; treat the dates above as authoritative.
Backfilling the declared history requires re-creating the store, so both the covered window and the axis itself will change before this dataset is promoted to production.
Because the forecast step is 24 hourly, most surface variables are daily means or daily mean
rates rather than instantaneous values — that is what the average_ prefix denotes. Surface and
single-level variables are at the dataset root. Temperature, specific humidity, both wind
components, vertical velocity and geopotential height are carried on 10 pressure levels
(1000, 925, 850, 700, 500, 300, 200, 100, 50 and 10 hPa) in the pressure_level group.
The 0 hour lead time carries no surface data. A 24 hour statistic needs a preceding day, so 27
of the 29 root variables are entirely NaN at lead_time=0; only pressure_reduced_to_mean_sea_level
and pressure_surface, which are instantaneous, have values there. Every variable in the
pressure_level group is instantaneous and is present at the 0 hour lead time. Selecting
lead_time=slice("24h", None) is the safe default for surface fields.
Several variables are masked to the domain they describe, and read as NaN outside it:
sea_surface_temperature and sea_ice_area_fraction over land; the soil moisture, soil temperature
and runoff fields over ocean; and snow_albedo_surface and snow_density_surface wherever there is
no snow. In the pressure_level group, specific_humidity is not provided above 200 hPa and is
NaN on the 100, 50 and 10 hPa levels.
Two absences are worth knowing about before you plan around this dataset.
precipitation_convective_surface is the only precipitation rate carried — there is no total
precipitation — and wind is available only on pressure levels, as wind_u and wind_v, with no
10 metre winds. At the surface, eastward_turbulent_surface_stress and
northward_turbulent_surface_stress are what describe the momentum flux here.
Neither absence is a limit of the sub-seasonal forecast itself. ECMWF publishes total precipitation and the 10 metre winds for it, but on a 6 hourly step rather than the 24 hourly step of this dataset, and the grib archive this dataset is built from does not currently retrieve them.
Each forecast contains 101 ensemble members: a control member (0) and 100 perturbed members (1-100). The control forecast is produced with the best available data and unperturbed models. The other 100 members are each produced with slight perturbations of initial conditions and of the models. Taken together, the ensemble of 101 forecasts shows the range of possible outcomes and the likelihood of their occurrence. A 101 member ensemble is larger than the 51 members of ECMWF's medium-range forecast, which matters at sub-seasonal lead times where the useful signal is in the distribution rather than in any single trace.
IFS 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 Source Cooperative, a Radiant Earth initiative. Icechunk storage 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. Chunks are grouped into larger shards (the objects actually written to storage), which keeps the object count manageable for long-archive datasets. 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 | shard |
|---|---|---|
| init_time | 1 (1 day) | 1 (1 day) |
| lead_time | 47 (47 days) | 47 (47 days) |
| ensemble_member | 101 | 101 |
| latitude | 25 (37.5°) | 125 (181.5°) |
| longitude | 24 (36°) | 240 (360°) |
| uncompressed | 10.9 MiB | 543.3 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.