# Groundtruth - validating ERA5 against real weather station observations (5 climate zones, runs in Binder)

**URL:** <https://discourse.pangeo.io/t/groundtruth-validating-era5-against-real-weather-station-observations-5-climate-zones-runs-in-binder/5534>\
**Category:** Science\
**Created:** [March 13, 2026, 8:27pm UTC](https://discourse.pangeo.io/t/groundtruth-validating-era5-against-real-weather-station-observations-5-climate-zones-runs-in-binder/5534 "2026-03-13T20:27:18Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Northflow](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.pangeo.io/northflow/32/3638_2.png) [@Northflow](https://discourse.pangeo.io/u/Northflow)\
**Post date:** [March 13, 2026, 8:27pm UTC](https://discourse.pangeo.io/t/groundtruth-validating-era5-against-real-weather-station-observations-5-climate-zones-runs-in-binder/5534/1 "2026-03-13T20:27:18Z")

</div>

ERA5 is used in thousands of climate studies every year. But validation against actual weather station observations, structured, reproducible, and exportable - is rarely done. This notebook changes that.

 ![ERA5vsStation](https://canada1.discourse-cdn.com/flex030/uploads/pangeo/original/2X/1/1f1bdf9d05b4b5827e9ef541ecd02722b9cc91b6.png)

**What it does:** Five stations across five climate zones (Oslo, Madrid, Nairobi, Toronto, Sydney). Daily 2m air temperature. 2015–2020. Zero credentials required, Open-Meteo + Meteostat, both free, no API keys.

**Outputs:**

- Per-station metric scorecard (RMSE, MAE, Mean Bias, Pearson r, Taylor Skill Score)

- Multi-panel ERA5 vs station time series

- World map of stations sized and colored by RMSE (pure matplotlib, no cartopy)

- Climate zone comparison bar chart

- Exportable HTML/JSON/Markdown validation report

150+ lines of boilerplate without climval. 10 lines with it. Same rigour. Exportable results.

Powered by [climval](https://pypi.org/project/climval) — `pip install climval` — our open-source Python library for climate model validation. GitHub: [https://github.com/northflowlabs/climval](https://github.com/northflowlabs/climval)

**Run it now (no setup):** [![](https://canada1.discourse-cdn.com/flex030/uploads/pangeo/original/2X/b/b6d4c7eb32c0269ac69b00158c779c57cfb12460.svg)](https://mybinder.org/v2/gh/northflowlabs/northflow-notebooks/HEAD?filepath=notebooks/era5_station_validation.ipynb)

**GitHub:** [https://github.com/northflowlabs/northflow-notebooks/blob/main/notebooks/era5\_station\_validation.ipynb](https://github.com/northflowlabs/northflow-notebooks/blob/main/notebooks/era5_station_validation.ipynb)

---

<div class="post-metadata">

**Author:** ![Tman](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.pangeo.io/tman/32/3009_2.png) [@Tman](https://discourse.pangeo.io/u/Tman)\
**Post date:** [March 27, 2026, 3:33pm UTC](https://discourse.pangeo.io/t/groundtruth-validating-era5-against-real-weather-station-observations-5-climate-zones-runs-in-binder/5534/2 "2026-03-27T15:33:36Z")

</div>

This is awesome work, thank you for putting your time into this.

The only thing I’d like to flag here is that ERA5’s 2m temperature outputs should be height-adjusted to account for discrepancies between the reanalysis grid and the station’s actual height above sea/ground level. Usually the lowest-hanging fruit is to correct it using ~6.5K/km. If your code does that already, even better!

---

<div class="post-metadata">

**Author:** ![Northflow](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.pangeo.io/northflow/32/3638_2.png) [@Northflow](https://discourse.pangeo.io/u/Northflow)\
**Post date:** [March 29, 2026, 4:03pm UTC](https://discourse.pangeo.io/t/groundtruth-validating-era5-against-real-weather-station-observations-5-climate-zones-runs-in-binder/5534/3 "2026-03-29T16:03:28Z")

</div>

Thanks Tman, really good point! The current version doesn’t apply a lapse-rate correction, so the bias values at stations with significant elevation mismatch (especially Oslo and Nairobi where ERA5 orography deviates most from station altitude) will include a systematic height related component.

We’ll add an optional height correction using the ~6.5 K/km standard lapse rate in the next update, comparing ERA5 orography elevation to station metadata elevation via Meteostat and applying the adjustment before validation. Good candidate for a `climval` preprocessing utility too.

Appreciate the feedback, this is exactly the kind of thing that makes the validation more defensible.

All the best,

Tom
