Climate anomaly
Publishes a datasetDescription
Compute an anomaly (observed − climatological normal) and publish it as a new GeoZarr dataset
Loads a published observed collection over a time range and a published climatological normal, computes the anomaly (observed − normal, aligned by day-of-year or month), and publishes the result as a new GeoZarr dataset with the observed t axis preserved.
Use it to derive anomalies from datasets already on the instance — e.g. the observed era5land_temperature_daily against the normal era5land_temperature_daily_normal_1991_2020. The normal must already exist (compute it with the climate_normal workflow, or use an EDH-direct normal data source).
Keep an anomaly dataset current by re-running this workflow over the desired range — recomputing observed − normal is a cheap lazy subtract, so no incremental sync cascade is needed.
If the output_dataset_id has no registered data source, managed save_result auto-registers one (inheriting units/period_type from the observed dataset). Pre-registering a static data source (a dataset template in plugins/rasters/ with sync: {kind: static} and a display block) is recommended for anomalies so you control the diverging colormap centred on zero. No ingestion plugin is required — the data is produced by this workflow.
Zarr output cannot be produced synchronously, so run this as a batch job (POST /jobs, then POST /jobs/{id}/results):
{
"anomaly": {
"process_id": "climate_anomaly",
"arguments": {
"observed_dataset_id": "era5land_temperature_daily",
"normal_dataset_id": "era5land_temperature_daily_normal_1991_2020",
"output_dataset_id": "era5land_temperature_daily_anomaly_1991_2020",
"variable": "t2m",
"temporal_extent": ["2024-01-01", "2024-12-31"],
"method": "absolute"
},
"result": true
}
}
Parameters
| Name | Type | Description |
|---|---|---|
observed_dataset_id
required
|
string | ID of the published observed collection (datetime time axis), e.g. era5land_temperature_daily. |
normal_dataset_id
required
|
string | ID of the published climatological normal (with a dayofyear or month ordinal axis). |
output_dataset_id
required
|
string | ID of the anomaly dataset to publish. Auto-registered if no static data source exists, taking its units from the computed result (so a relative anomaly registers as '%'); pre-register one to control the diverging display, making sure its units match the method (no ingestion plugin needed). |
variable
required
|
string | Variable/band name carried through to the published anomaly dataset. |
temporal_extent
required
|
temporal-interval | Observed time range as [start, end] ISO-8601 date strings, e.g. ["2024-01-01", "2024-12-31"]. |
method
optional, default
"absolute" |
absolute | relative | 'absolute' (observed − normal, default) or 'relative' (percent of normal). A relative anomaly is published with units '%' rather than the observed variable's unit, so a pre-registered output data source must declare '%' to match; publishing into one that declares the observed unit is refused rather than relabelled. |
Produces
- 2m temperature daily anomaly (ERA5-Land, vs 1991–2020 normal)
- 2m temperature monthly anomaly (ERA5-Land, vs 1991–2020 normal)
- Precipitation daily anomaly (CHIRPS3, vs 1991–2020 normal)
- Precipitation daily anomaly (ERA5-Land, vs 1991–2020 normal)
- Precipitation daily relative anomaly (CHIRPS3, vs 1991–2020 normal)
- Precipitation daily relative anomaly (ERA5-Land, vs 1991–2020 normal)
- Precipitation monthly anomaly (CHIRPS3, vs 1991–2020 normal)
- Precipitation monthly anomaly (ERA5-Land, vs 1991–2020 normal)
- Precipitation monthly relative anomaly (CHIRPS3, vs 1991–2020 normal)
- Precipitation monthly relative anomaly (ERA5-Land, vs 1991–2020 normal)
Automation
No automation runs this workflow on this instance.