Environment · Public data

Air quality in Europe, daily

PM2.5, PM10, NO2 and ozone at Europe's monitoring stations, day by day.

European Environment Agency, Air Quality download service (E2a, up-to-date data) · EEA standard re-use policy: CC BY 4.0 · commons_pubdata.environment.air_quality_daily

Read Markdown
1,671 PM2.5 stations, their last 30 days' mean; orange: 10 µg/m³ or more.
1,671 PM2.5 stations, their last 30 days' mean; orange: 10 µg/m³ or more.

Query it with DuckDB.

Bash
lhbox duckdb --catalog commons/pubdata
SQL · The worst PM2.5 days this year, with the station behind them
SELECT d.date, s.station_name, s.municipality, s.country_code, round(d.mean, 1) AS pm25
FROM commons_pubdata.environment.air_quality_daily AS d
JOIN commons_pubdata.environment.air_quality_stations AS s USING (sampling_point_id)
WHERE d.pollutant = 'PM2.5' AND d.valid_hours >= 18
ORDER BY d.mean DESC LIMIT 20;

Read it where you work.

Public, read-only data. With an account, lhbox duckdb attaches the catalog as commons_pubdata; an agent with the LakehouseBox connector opens it with open_public_catalog("commons/pubdata"). Without one, DuckDB reads the public files directly.

Example queries

  • The worst PM2.5 days this year, with the station behind them
    SELECT d.date, s.station_name, s.municipality, s.country_code, round(d.mean, 1) AS pm25
    FROM commons_pubdata.environment.air_quality_daily AS d
    JOIN commons_pubdata.environment.air_quality_stations AS s USING (sampling_point_id)
    WHERE d.pollutant = 'PM2.5' AND d.valid_hours >= 18
    ORDER BY d.mean DESC LIMIT 20;
  • Days above the WHO 2021 daily guideline for NO2 (25 µg/m³) per country, traffic stations only
    SELECT s.country_code, count(*) AS station_days
    FROM commons_pubdata.environment.air_quality_daily AS d
    JOIN commons_pubdata.environment.air_quality_stations AS s USING (sampling_point_id)
    WHERE d.pollutant = 'NO2' AND s.station_type = 'traffic' AND d.valid_hours >= 18 AND d.mean > 25
    GROUP BY 1 ORDER BY 2 DESC;

Know your columns.

ColumnTypeMeaning
datedatethe day (the measurement hours' start dates)
sampling_point_idstringthe EEA sampling point, <country>/SPO-… (joins air_quality_stations)
pollutantstringPM2.5, PM10, NO2 or O3
pollutant_codelongthe EEA pollutant vocabulary code (6001, 5, 8, 7)
meandoublemean of the day's valid hourly values
maxdoublehighest valid hourly value of the day
View all 8 columns
valid_hourslonghow many valid hourly values the day had (24 = complete)
unitstringunit as reported, usually ug.m-3 (micrograms per cubic metre)

Join keys: sampling_point_id.

Companion tables

  • commons_pubdata.environment.air_quality_stations: one row per sampling point: station code and name, country, pollutant, coordinates, altitude, area (urban, suburban, rural) and type (traffic, industrial, background), municipality

Before you query.

  1. Values are unverified (E2a): an isolated spike can be an instrument fault the verified release later removes.
  2. Require valid_hours >= 18 (75 % of the day, the EU's own completeness rule) before comparing days or stations.
  3. Join air_quality_stations for coordinates and for station_type (traffic, industrial, background) and area; comparing a traffic station with a rural background one is comparing different things.
  4. Ozone peaks in summer afternoons, so its daily mean understates it: use max or a running 8-hour mean on the hourly source for health thresholds.

Source & licence.

Source
European Environment Agency, Air Quality download service (E2a, up-to-date data)
Licence
EEA standard re-use policy: CC BY 4.0
Attribution
© European Environment Agency (EEA), Air Quality e-Reporting (E2a, up-to-date, unverified).
Coverage
the 39 countries reporting to the EEA (EU-27, EFTA, the UK, the Western Balkans, Andorra, Gibraltar, Kosovo); 1 January of the current year to the latest reported day (the table restarts with each new year)
Refresh
weekly, the whole table replaced; source version eea e2a to 2026-10-10
Table
commons/pubdata · environment.air_quality_daily · Iceberg v2 · browse the catalog
Recipe
pubdata/recipes/air_quality.py, registry entry pubdata/registry/air_quality.yaml

Source: European Environment Agency, Air Quality download service (E2a, up-to-date data) · EEA standard re-use policy: CC BY 4.0 · Snapshot shown: 10 Oct 2026HTML for people. Markdown for agents.