Stop using annual averages for Scope 2 grid emissions

Ask a sustainability officer for the carbon intensity of the French grid and you will get a single static number — say 55 gCO2/kWh. For annual Scope 2 accounting on a static building, that average is fine. For trading carbon, optimising battery dispatch, or running carbon-aware compute, an annual average is detached from physical reality.

The grid is dynamic; your data should be too

Electricity is not fungible across hours. The mix at 2pm on a sunny Tuesday is nothing like 8pm on a windless Thursday. During the afternoon solar peak the marginal unit is often zero-carbon; by evening, as solar fades and demand ramps, the operator spins up gas or coal. Shift a 10 MWh workload from 8pm to 2pm and you have avoided real atmospheric emissions — but you can only prove and monetise that with interval-level grid carbon intensity.

Calculating real-time gCO2/kWh

The true carbon intensity of a bidding zone in a given interval is a generation-weighted average of lifecycle emission factors: take the ENTSO-E generation-by-fuel feed, map each production type to its IPCC AR5 lifecycle factor (lignite ~1050 gCO2/kWh, offshore wind ~12), multiply by the MW generated that interval, and divide by total generation. Done historically across European bidding zones that means parsing tens of millions of rows of XML, handling anomalous negative generation (battery charging), and normalising 15-minute data onto a consistent grid.

The environmental data, already built

We compute the generation-weighted carbon intensity for European bidding zones at half-hourly resolution, and pair it with the annual and industrial views:

Build honest carbon models on interval data, not a yearly constant. Everything is analysis-ready Parquet with a documented licence — browse the catalog.

Skip the ETL

Stop building parsers. Start at the analysis.

We've already cleaned, documented and QC'd sources like the one in this post into query-ready Parquet - with a free sample on every dataset. Buy a file from €9, or go All-Access for the lot.