Dataset spotlight: European Day-Ahead Electricity Prices
If you model European power, the day-ahead price is the spine everything hangs off. It is also the dataset people most often get subtly wrong. Here is what is inside our European Day-Ahead Prices product and why it is built the way it is.
What you get
- ~40 bidding zones — from
DE_LUandFRdown to the Italian zonal split (IT_NORD,IT_SUD,IT_SICI…) and the NordicNO1–NO5,SE1–SE4. - Hourly resolution, 2018 to present — millions of rows, one per zone per hour, all timestamped in UTC.
- Negative prices preserved. This matters: those sub-zero hours are not errors, they are real renewable-glut events and often the most interesting rows in the file.
- Two layouts — a single flat Parquet for quick scans and a partitioned (zone/year) tree for selective reads.
Why the grain is the point
The schema is deliberately boring: zone, ts, price_eur_mwh, unit, res_min. Boring is the feature. Because the grain is one row per zone per hour, deduplicated, UTC, it joins cleanly to load, generation-by-fuel and outages on (zone, ts) with no surprises. Most of the pain in power analytics is misaligned joins; we removed that pain at the source.
Three things we handled so you don't
1. Mixed native resolutions. Some zones publish 15- or 30-minute data. We record the native res_min and present a consistent hourly series, so a quarter-hourly zone never silently outweighs an hourly one in an average. 2. DST seams. Every spring-forward and fall-back is correct because the series is anchored to UTC, not local wall-clock. 3. Gaps. Where a zone went dark, the QC report says so — you will not average over a short day by accident.
A first query
With the flat file, your first correct chart is about four lines:
import duckdb duckdb.sql("SELECT zone, date_trunc('month', ts) m, avg(price_eur_mwh) FROM 'prices.parquet' GROUP BY 1,2")
That is the whole point: you are exploring the market in minutes, not debugging an XML parser for a week. If you also need load and generation aligned to these exact zones and timestamps, see electricity load and generation by fuel — or grab All-Access for the whole catalogue.
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.