Skip to content
NOAA GHCN-Daily

275 years of the world’s weather, station by station.

132,501 weather stations. 95.1 million monthly observations, from 1750 to this morning. Explore them on a map, in charts, or just ask.

The stripes above are a placeholder while the API is built — shaped like an anomaly series, but not measured from anything.
132,501
stations
Every station in the GHCN-Daily inventory, on six continents.
95.1M
monthly observations
Station × element × year × month, aggregated from ~8 GB of daily records.
1750
earliest record
Through to the present — a little over 275 years of coverage.
nightly
full rebuild
NOAA rewrites history, so the pipeline rebuilds everything rather than appending.

What you can do with it

  • The map

    in progress

    Gridded anomalies on equal-area H3 cells, scrubbable by month across 275 years. Thinly-sampled cells are drawn as thinly sampled, not filled in.

  • The charts

    in progress

    Warming stripes, station timeseries with a completeness band, and year-by-month anomaly heatmaps — each against that station’s own baseline.

  • The chat

    planned

    Ask in plain language. Answers come from validated tool calls against a small typed surface, not from a model writing SQL against the database.

Read honestly, or not at all

This is raw station data. It has not been homogenised, and the station network itself has changed enormously — two-thirds of stations measure only precipitation, and coverage is heavily biased toward North America and Europe.

Anomalies, never averages

A naive global average across these stations plots the changing station mix, not the climate. Everything spatial is aggregated as a departure from each station’s own 1991–2020 baseline.

Sparse rows stay visible

A monthly mean from three observations is not a monthly mean. Every aggregate carries n_obs and completeness, and the API will not hide them from you.

Failed checks are dropped

Observations NOAA flagged as failing a quality check are excluded outright rather than marked and quietly carried forward into the aggregates.

The full method, including what this data cannot tell you →

How it gets here

  1. 01

    NOAA S3

    9.2 GB Parquet, public, us-east-1
  2. 02

    Fargate + DuckDB

    one pass, five aggregate stages
  3. 03

    S3 curated

    Parquet + CSV lake
  4. 04

    RDS Postgres

    PostGIS + h3, atomic schema swap
  5. 05

    Lambda in VPC

    the only route to the database
  6. 06

    Vercel

    Next.js, edge-cached

The pipeline never copies the source. NOAA’s Parquet already sits in S3 in the region the compute runs in; each nightly run re-shapes it into aggregates matched to the queries this app actually makes.

The curated tables

TableGrainRows
stationsstation132,501
monthlystation × element × year × month95.1M
annualstation × element × year9.0M
normalsstation × element × month600k
grid_monthlyH3 cell × element × year × month27.5M