Next free-source hunt
We check for new free data every weekday.
Datasets / Energy
energy.ec.europa.eu/

EU Weekly Oil Bulletin

Freeauth: noneCC-BY-4.0#energy#historical-data#time-series#prices#commodities✓ verified Nov 1, 2026

EU Weekly Oil Bulletin

The European Commission publishes downloadable Excel workbooks of weekly consumer prices for petroleum products across EU countries, both with and without duties and taxes. The history workbook contains dates, country or regional codes, euro-super 95, automotive diesel, heating oil, low- and high-sulphur fuel oil and motor LPG prices with stated volume or mass units; no key is needed.

Required Attribution:

Give appropriate credit to the European Union and indicate changes, with a link to CC BY 4.0 where practical.

Coverage

The checked history workbook contains weekly observations from 3 January 2005 through 26 October 2026 for EU and country series, with separate sheets for taxed prices, untaxed prices, consumption, VAT, excise duties and other indirect taxes. The bulletin page describes weekly updates, while reporting notes and product availability vary by country.

Verdict

This is a cross-country retail petroleum-price signal for tracking fuel-cost pressure, tax effects and regional divergence in the EU. Weekly frequency is useful for trend and shock detection but is slower than wholesale or intraday markets. National reporting methods and available products differ, and the workbook contains blanks and structural sheets that need deliberate parsing. Preserve tax status, units and country methodology notes when comparing series.

Get the free weekly email

Free weekly email of newly verified free data. Unsubscribe by emailing us.

Use in your agent

Load EU weekly oil prices into pandas and Parquet. Checked against the provider's documentation on Nov 1, 2026.

Raw skill file (/skills/eu-weekly-oil-bulletin.md)Also in our MCP server: call get_ingestion_skill with {"slug": "eu-weekly-oil-bulletin"}.

Access

  • No account or key; the historical XLSX workbook is a public download.
  • The example parses the first worksheet with Python's standard XLSX ZIP/XML support, so it does not require an Excel engine.

Request

bash
curl -O 'https://energy.ec.europa.eu/document/download/906e60ca-8b6a-44e7-8589-652854d2fd3f_en?filename=Weekly_Oil_Bulletin_Prices_History_maticni_4web.xlsx'

Format

XLSX workbook with weekly taxed and untaxed petroleum-price sheets plus consumption, VAT, excise-duty and other-tax sheets; the price sheets use Excel date serials and product-specific units.

Load into pandas and Parquet

Needs Python 3 with requests, pandas and pyarrow.

python
"""EU aggregate weekly taxed petroleum prices -> pandas -> Parquet."""
import io
import zipfile
import xml.etree.ElementTree as ET
import requests
import pandas as pd

URL = "https://energy.ec.europa.eu/document/download/906e60ca-8b6a-44e7-8589-652854d2fd3f_en?filename=Weekly_Oil_Bulletin_Prices_History_maticni_4web.xlsx"
response = requests.get(URL, timeout=120)
response.raise_for_status()
ns = "{http://schemas.openxmlformats.org/spreadsheetml/2006/main}"
with zipfile.ZipFile(io.BytesIO(response.content)) as book:
    strings_root = ET.fromstring(book.read("xl/sharedStrings.xml"))
    strings = ["".join(t.text or "" for t in item.iter(ns + "t")) for item in strings_root]
    rows = []
    for _, row in ET.iterparse(book.open("xl/worksheets/sheet1.xml"), events=("end",)):
        if row.tag != ns + "row" or int(row.attrib["r"]) < 4:
            continue
        cells = {}
        for cell in row.findall(ns + "c"):
            ref = cell.attrib["r"]
            value_node = cell.find(ns + "v")
            if value_node is None:
                continue
            value = value_node.text
            if cell.attrib.get("t") == "s":
                value = strings[int(value)]
            cells["".join(c for c in ref if c.isalpha())] = value
        try:
            date_serial = float(cells.get("A", ""))
            values = [float(cells[column]) for column in "CDEFGH"]
        except (KeyError, ValueError):
            row.clear()
            continue
        if date_serial > 10000:
            rows.append({
                "date_serial": date_serial,
                "eu_eurosuper95_per_1000l": values[0],
                "eu_diesel_per_1000l": values[1],
                "eu_heating_oil_per_1000l": values[2],
                "eu_low_sulphur_fuel_oil_per_t": values[3],
                "eu_high_sulphur_fuel_oil_per_t": values[4],
                "eu_motor_lpg_per_1000l": values[5],
            })
        row.clear()
df = pd.DataFrame(rows)
df["date"] = pd.Timestamp("1899-12-30") + pd.to_timedelta(df.pop("date_serial"), unit="D")
df = df.sort_values("date")
df.to_parquet("eu_weekly_oil_prices.parquet", index=False)
print(len(df), "weekly EU observations", df["date"].min().date(), "to",
      df["date"].max().date(), "across", len(df.columns) - 1, "price series")

Run by us on 2026-11-01 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 1090 weekly EU observations 2005-01-03 to 2026-10-26 across 6 price series

Limits

  • Rate limit: Not stated.
  • The history file is a multi-sheet XLSX workbook rather than a normalized table.
  • Country and product availability differ across the workbook.

Quirks

  • Dates are stored as Excel serial numbers in the checked history workbook.
  • The first rows form a multi-level header with product names and units; the example assigns explicit names only to the six EU aggregate price columns.
  • Taxed and untaxed prices are separate sheets, and some fuel-oil or LPG cells are blank.

Terms and attribution

  • EU-owned website content is CC BY 4.0 unless an individual notice states otherwise.
  • Credit the source and indicate changes; third-party rights and protected marks are excluded.

Sources

Information and education only. Not financial, investment, legal or tax advice. Listings can be inaccurate, incomplete or out of date and are provided "as is". Free tiers, limits and licenses belong to each provider and can change, so check the provider's own terms before you rely on them. Terms & Disclaimer