Data HubContributeData Hub on GitHub

AgERA5 daily agrometeorological indicators

Copernicus Climate Change Service (C3S), ECMWF

Version2.0Restricted access
licenseCC-BY-4.0doi10.24381/cds.6c68c9bbcreated2026-10-08updated2026-10-14

Overview

Daily surface weather for agriculture, 1979 to present, on a global 0.1° grid. AgERA5 aggregates the hourly ECMWF ERA5 reanalysis to local-time days and corrects it to the finer topography, land use and coastlines of ECMWF’s 0.1° HRES model. Its 27 variables (air and dew point temperature, precipitation, solar radiation, humidity, vapour pressure, wind, cloud cover, snow, FAO-56 reference evapotranspiration) match the inputs of most crop and agro-ecological models. The primary access is ECMWF’s two analysis-ready Zarr stores, one chunked for time series at points and one for maps of a region; a Google Earth Engine copy and the CDS API are alternatives.

Important note

Each day runs midnight to midnight local time at the grid cell, not UTC. Temperatures are kelvin and solar radiation is J m-2 d-1; convert as needed. The time axis trails real time by about a week. Values are reanalysis, not station observations: expect bias at single sites, especially for precipitation in mountains.

Quick start

Python
"""Read AgERA5 daily values for a few points from the ECMWF ARCO Zarr store.

Needs a free Copernicus CDS account and its Personal Access Token (see AGENTS.md):
  pip install xarray zarr dask fsspec aiohttp
  CDSAPI_KEY=<token> python example.py
"""

import os
from pathlib import Path

import xarray as xr

# "geoChunked" = small spatial tiles, long time runs: cheap for long time series at a few places.
# Swap in .../cadl-arco-time-001/.../timeChunked.zarr (one day per chunk) for maps on a few days.
URL = "https://arco.datastores.ecmwf.int/cadl-arco-geo-001/arco/sis_agrometeorological_indicators/all/geoChunked.zarr"


def cds_key() -> str:
    """CDSAPI_KEY env var, else the `key:` line of ~/.cdsapirc."""
    if key := os.environ.get("CDSAPI_KEY"):
        return key
    rc = Path.home() / ".cdsapirc"
    if rc.exists():
        for line in rc.read_text().splitlines():
            if line.startswith("key:"):
                return line.split(":", 1)[1].strip()
    raise SystemExit("No CDS key: set CDSAPI_KEY or create ~/.cdsapirc")


ds = xr.open_zarr(
    URL,
    consolidated=True,
    chunks={},
    storage_options={"headers": {"Authorization": f"Bearer {cds_key()}"}},
)

# Pick variables and dates first, then all points in one vectorised sel.
variables = ["Temperature_Air_2m_Max_24h", "Temperature_Air_2m_Min_24h", "Precipitation_Flux"]
lats = [-1.29, 9.03]  # Nairobi, Addis Ababa
lons = [36.82, 38.74]
points = dict(latitude=xr.DataArray(lats, dims="pt"), longitude=xr.DataArray(lons, dims="pt"))

sub = ds[variables].sel(time=slice("2023-01-01", "2023-12-31")).sel(**points, method="nearest").compute()

df = sub.to_dataframe().reset_index()
df["tmax_c"] = df["Temperature_Air_2m_Max_24h"] - 273.15  # kelvin to celsius
print(df.head())

Provided by the dataset authors: Python example

Full access details and endpoints

Intended uses

  • daily weather inputs for crop, livestock and agro-ecological models
  • weather time series for trial sites, farms and other point locations
  • growing-season summaries such as rainfall totals, heat days and evapotranspiration

Not recommended for

hourly or sub-daily analysis

Why: AgERA5 is a daily aggregate.

Use instead: ERA5 hourly data on single levels (DOI 10.24381/cds.adbb2d47).

station-accurate values at one site

Why: reanalysis on an 11 km grid, so local effects and extremes are smoothed.

Use instead: nearby weather station records, with AgERA5 to fill gaps.

Access & use

Files, endpoints, and worked examples for each distribution.

Access conditions

Free, but every route needs an account. The Zarr stores and the CDS API take a Copernicus Climate Data Store (CDS) Personal Access Token: register at https://cds.climate.copernicus.eu, copy the token from your profile page, then open the dataset page, go to the Download tab and accept the dataset licence at the bottom. Until the licence is accepted the stores answer 401 or 403 even with a valid token. Send the token as an HTTP header "Authorization: Bearer <token>"; example.py beside this record is a working call. The Earth Engine asset needs a Google Earth Engine account.

Data

zarr-geo-chunked

Primary access. Zarr store chunked 2112 days x 16 lat x 32 lon (about 5.8 years x 1.6° x 3.2° per chunk), so long time series at a few points or a small area read few chunks. Slow for a whole region on one day; use the time-chunked store for that.

Format: Zarr — best for cloud-native analysis, reading just the slices you need from the full cube

Variables: Temperature_Air_2m_Max_24h, Temperature_Air_2m_Min_24h, Temperature_Air_2m_Mean_24h, Temperature_Air_2m_Max_Day_Time, Temperature_Air_2m_Mean_Day_Time, Temperature_Air_2m_Min_Night_Time +21 more

Dimensions: cell × time

Data dictionary →

Access the data

https://arco.datastores.ecmwf.int/cadl-arco-geo-001/arco/sis_agrometeorological_indicators/all/geoChunked.zarr

zarr-time-chunked

Same data chunked 1 day x 1024 lat x 1024 lon, so a map of a region or the globe for a few days reads few chunks. Slow for long time series; use the geo-chunked store for that.

Format: Zarr — best for cloud-native analysis, reading just the slices you need from the full cube

Variables: Temperature_Air_2m_Max_24h, Temperature_Air_2m_Min_24h, Temperature_Air_2m_Mean_24h, Temperature_Air_2m_Max_Day_Time, Temperature_Air_2m_Mean_Day_Time, Temperature_Air_2m_Min_Night_Time +21 more

Dimensions: cell × time

Data dictionary →

Access the data

https://arco.datastores.ecmwf.int/cadl-arco-time-001/arco/sis_agrometeorological_indicators/all/timeChunked.zarr

gee

Google Earth Engine image collection projects/climate-engine-pro/assets/ce-ag-era5-v2/daily, curated by Climate Engine. One image per day, same band names and units as the Zarr stores, but 21 of the 27 variables.

Variables: Temperature_Air_2m_Max_24h, Temperature_Air_2m_Min_24h, Temperature_Air_2m_Mean_24h, Temperature_Air_2m_Max_Day_Time, Temperature_Air_2m_Mean_Day_Time, Temperature_Air_2m_Min_Night_Time +15 more

Dimensions: cell × time

Data dictionary →

Access the data

https://earthengine.googleapis.com/v1/projects/climate-engine-pro/assets/ce-ag-era5-v2/daily

Other access methods
Earth Engine:ee://projects/climate-engine-pro/assets/ce-ag-era5-v2/daily
cds-api

Backup route. The CDS retrieve API returns NetCDF per variable, statistic and period on request; slower than the Zarr stores and queued, but needs only the cdsapi package.

Format: application/x-netcdf

Variables: Temperature_Air_2m_Max_24h, Temperature_Air_2m_Min_24h, Temperature_Air_2m_Mean_24h, Temperature_Air_2m_Max_Day_Time, Temperature_Air_2m_Mean_Day_Time, Temperature_Air_2m_Min_Night_Time +21 more

Dimensions: cell × time

Data dictionary →

Access the data

https://cds.climate.copernicus.eu/api/retrieve/v1/processes/sis-agrometeorological-indicators

Additional assets

exampleexample

Reads three variables for two points and one year from the geo-chunked store with the CDS token.

Format: text/x-python

View example
Python
"""Read AgERA5 daily values for a few points from the ECMWF ARCO Zarr store.

Needs a free Copernicus CDS account and its Personal Access Token (see AGENTS.md):
  pip install xarray zarr dask fsspec aiohttp
  CDSAPI_KEY=<token> python example.py
"""

import os
from pathlib import Path

import xarray as xr

# "geoChunked" = small spatial tiles, long time runs: cheap for long time series at a few places.
# Swap in .../cadl-arco-time-001/.../timeChunked.zarr (one day per chunk) for maps on a few days.
URL = "https://arco.datastores.ecmwf.int/cadl-arco-geo-001/arco/sis_agrometeorological_indicators/all/geoChunked.zarr"


def cds_key() -> str:
    """CDSAPI_KEY env var, else the `key:` line of ~/.cdsapirc."""
    if key := os.environ.get("CDSAPI_KEY"):
        return key
    rc = Path.home() / ".cdsapirc"
    if rc.exists():
        for line in rc.read_text().splitlines():
            if line.startswith("key:"):
                return line.split(":", 1)[1].strip()
    raise SystemExit("No CDS key: set CDSAPI_KEY or create ~/.cdsapirc")


ds = xr.open_zarr(
    URL,
    consolidated=True,
    chunks={},
    storage_options={"headers": {"Authorization": f"Bearer {cds_key()}"}},
)

# Pick variables and dates first, then all points in one vectorised sel.
variables = ["Temperature_Air_2m_Max_24h", "Temperature_Air_2m_Min_24h", "Precipitation_Flux"]
lats = [-1.29, 9.03]  # Nairobi, Addis Ababa
lons = [36.82, 38.74]
points = dict(latitude=xr.DataArray(lats, dims="pt"), longitude=xr.DataArray(lons, dims="pt"))

sub = ds[variables].sel(time=slice("2023-01-01", "2023-12-31")).sel(**points, method="nearest").compute()

df = sub.to_dataframe().reset_index()
df["tmax_c"] = df["Temperature_Air_2m_Max_24h"] - 273.15  # kelvin to celsius
print(df.head())
agent guideagents

Getting a key, choosing a store, variable units, and efficient point reads.

Format: text/markdown

Data dictionary

What each file holds. A layout describes how the data is stored in a file: its variables, the dimensions they vary over, and any keys.

File layouts

FilesFormatVariablesDimensionsNo data
zarr-geo-chunked, zarr-time-chunked, cds-apiZarr, application/x-netcdfTemperature_Air_2m_Max_24h, Temperature_Air_2m_Min_24h, Temperature_Air_2m_Mean_24h, Temperature_Air_2m_Max_Day_Time +23 morecell × time-9999
geeTemperature_Air_2m_Max_24h, Temperature_Air_2m_Min_24h, Temperature_Air_2m_Mean_24h, Temperature_Air_2m_Max_Day_Time +17 morecell × time-9999

In every file

Dimensions

cellxy

0.1° (~11 km at equator). Latitude ascends from -90 to 90, longitude from -180 to 179.9.

Grid spacing: 0.1 degree

timetemporal

Day, midnight to midnight local time (00-00LT). Grows daily, about a week behind present.

Only in zarr-geo-chunked, zarr-time-chunked, cds-api

Variables

VariableTypeUnitDescription
Temperature_Air_2m_Max_24hfloat32KMaximum air temperature at 2 m over the local day.
Temperature_Air_2m_Min_24hfloat32KMinimum air temperature at 2 m over the local day.
Temperature_Air_2m_Mean_24hfloat32KMean air temperature at 2 m over the local day.
Temperature_Air_2m_Max_Day_Timefloat32KMaximum air temperature at 2 m between 06 and 18 local time.
Temperature_Air_2m_Mean_Day_Timefloat32KMean air temperature at 2 m between 06 and 18 local time.
Temperature_Air_2m_Min_Night_Timefloat32KMinimum air temperature at 2 m between 18 and 06 local time.
Temperature_Air_2m_Mean_Night_Timefloat32KMean air temperature at 2 m between 18 and 06 local time.
Dew_Point_Temperature_2m_Mean_24hfloat32KMean dew point temperature at 2 m over the local day.
Precipitation_Fluxfloat32mm d-1Total precipitation over the local day.
Precipitation_Duration_Fractionfloat321Fraction of the day's hours with precipitation of at least 0.1 mm/h.
Precipitation_Rain_Duration_Fractionfloat321Fraction of the day's hours with rain.
Precipitation_Solid_Duration_Fractionfloat321Fraction of the day's hours with solid precipitation (freezing rain, snow, wet snow, rain-snow mix, ice pellets; no hail).
Solar_Radiation_Fluxfloat32J m-2 d-1Surface downward solar radiation summed over the local day.
ReferenceET_PenmanMonteith_FAO56float32mm d-1Penman-Monteith reference evapotranspiration, FAO-56 method, over the local day.
Derived_Relative_Humidity_2m_Max_24hfloat32%Maximum relative humidity at 2 m, derived from the daily minimum temperature and mean vapour pressure.
Derived_Relative_Humidity_2m_Min_24hfloat32%Minimum relative humidity at 2 m, derived from the daily maximum temperature and mean vapour pressure.
Relative_Humidity_2m_06hfloat32%Relative humidity at 2 m at 06 local time.
Relative_Humidity_2m_09hfloat32%Relative humidity at 2 m at 09 local time.
Relative_Humidity_2m_12hfloat32%Relative humidity at 2 m at 12 local time.
Relative_Humidity_2m_15hfloat32%Relative humidity at 2 m at 15 local time.
Relative_Humidity_2m_18hfloat32%Relative humidity at 2 m at 18 local time.
Vapour_Pressure_Mean_24hfloat32hPaMean vapour pressure over the local day.
Vapour_Pressure_Deficit_at_Maximum_Temperaturefloat32hPaVapour pressure deficit at the daily maximum temperature: saturated vapour pressure at the maximum temperature minus the daily mean vapour pressure.
Wind_Speed_10m_Mean_24hfloat32m s-1Mean wind speed at 10 m over the local day.
Cloud_Cover_Mean_24hfloat321Mean total cloud cover over the local day, 0 to 1.
Snow_Thickness_Mean_24hfloat32cmMean snow depth over the local day.
Snow_Thickness_LWE_Mean_24hfloat32cmMean snow liquid water equivalent over the local day.

Only in gee

Variables

VariableTypeUnitDescription
Temperature_Air_2m_Max_24hfloat32KMaximum air temperature at 2 m over the local day.
Temperature_Air_2m_Min_24hfloat32KMinimum air temperature at 2 m over the local day.
Temperature_Air_2m_Mean_24hfloat32KMean air temperature at 2 m over the local day.
Temperature_Air_2m_Max_Day_Timefloat32KMaximum air temperature at 2 m between 06 and 18 local time.
Temperature_Air_2m_Mean_Day_Timefloat32KMean air temperature at 2 m between 06 and 18 local time.
Temperature_Air_2m_Min_Night_Timefloat32KMinimum air temperature at 2 m between 18 and 06 local time.
Temperature_Air_2m_Mean_Night_Timefloat32KMean air temperature at 2 m between 18 and 06 local time.
Dew_Point_Temperature_2m_Mean_24hfloat32KMean dew point temperature at 2 m over the local day.
Precipitation_Fluxfloat32mm d-1Total precipitation over the local day.
Precipitation_Rain_Duration_Fractionfloat321Fraction of the day's hours with rain.
Precipitation_Solid_Duration_Fractionfloat321Fraction of the day's hours with solid precipitation (freezing rain, snow, wet snow, rain-snow mix, ice pellets; no hail).
Solar_Radiation_Fluxfloat32J m-2 d-1Surface downward solar radiation summed over the local day.
ReferenceET_PenmanMonteith_FAO56float32mm d-1Penman-Monteith reference evapotranspiration, FAO-56 method, over the local day.
Relative_Humidity_2m_06hfloat32%Relative humidity at 2 m at 06 local time.
Relative_Humidity_2m_15hfloat32%Relative humidity at 2 m at 15 local time.
Vapour_Pressure_Mean_24hfloat32hPaMean vapour pressure over the local day.
Vapour_Pressure_Deficit_at_Maximum_Temperaturefloat32hPaVapour pressure deficit at the daily maximum temperature: saturated vapour pressure at the maximum temperature minus the daily mean vapour pressure.
Wind_Speed_10m_Mean_24hfloat32m s-1Mean wind speed at 10 m over the local day.
Cloud_Cover_Mean_24hfloat321Mean total cloud cover over the local day, 0 to 1.
Snow_Thickness_Mean_24hfloat32cmMean snow depth over the local day.
Snow_Thickness_LWE_Mean_24hfloat32cmMean snow liquid water equivalent over the local day.

Technical metadata

The full spatial, temporal, and modeling detail behind the summaries elsewhere on this page.

Spatial

CRS
EPSG:4326
Extent (W S E N)
[-180, -90, 180, 90]
Coverage
World
Grid spacing
6 arc-minutes (~11 km at the equator)

Temporal

Start
1979-01-01
End
open (present)
Updates
Daily

Climate methods

Downscaling
Grid- and variable-specific regression from ERA5 interpolated to 0.1°, trained on ECMWF HRES at 0.1°, so values follow the finer topography, land use and land-sea mask. · 0.1 degree

Provenance

Ordered processing steps, from source to publication.

  1. source

    Hourly ERA5 aggregated to local-time days and corrected to a 0.1° grid with regressions trained on ECMWF HRES, by Wageningen Environmental Research for the Copernicus Climate Change Service. Published on the Climate Data Store as NetCDF.

    Derived from: ECMWF ERA5 reanalysis ↗

How to cite

Please cite the dataset and any associated peer-reviewed publications.

H. Boogaard, J. Schubert, A. De Wit, J. Lazebnik, R. Hutjes, G. Van der Grijn (2020) Agrometeorological indicators from 1979 to present derived from reanalysis. Version 2.0. Copernicus Climate Change Service (C3S) Climate Data Store (CDS). https://doi.org/10.24381/cds.6c68c9bb. Accessed through the CGIAR Climate Action Data Hub, https://cgiar-climate-data-hub.github.io/catalog/agera5_2.0/.
BibTeX
BibTeX
@misc{agera5_2020,
  title     = {Agrometeorological indicators from 1979 to present derived from reanalysis},
  author    = {Boogaard, H. and Schubert, J. and De Wit, A. and Lazebnik, J. and Hutjes, R. and Van der Grijn, G.},
  year      = {2020},
  version   = {2.0},
  publisher = {Copernicus Climate Change Service (C3S) Climate Data Store (CDS)},
  doi       = {10.24381/cds.6c68c9bb},
  note      = {Accessed through the CGIAR Climate Action Data Hub, https://cgiar-climate-data-hub.github.io/catalog/agera5_2.0/}
}

Attribution

Reproduce this credit line wherever you reuse the data.

Generated using Copernicus Climate Change Service information [year].

Contacts

Who produced this dataset, and who to reach about it.

Brayden YoungbergMaintainer
Alliance of Bioversity International and CIAT
Copernicus Climate Change Service (C3S), ECMWFLicensor
Producer