Importera Ei nätavgifter — XLSX-parsing
Energimarknadsinspektionens datakälla, struktur och fällor.
Datakälla
Energimarknadsinspektionen publicerar årligen tre XLSX-filer med nätavgifter per nätägare:
- Hushållskunder (lägenhet, villa 16A-25A)
- Större säkringskunder (35-200A)
- Effektkunder (med effekttariff)
URL: https://ei.se/om-oss/statistik-och-oppna-data/natavgifter---elnat
Format
Wide-format med multi-header: - Rad 1: Typkund (t.ex. "Villa 16A, 5 000 kWh/år") - Rad 2: NT-kod (NT1610, NT2010 osv) - Rad 3: Metric (Myndighetsavgift, Fast avgift, Rörlig, Total, Antal uttagspunkter) - Rad 4: År (2026, 2025, 2024, 2023, 2022) - Rad 5+: Datarader, en per nätägare/REL-koncession
Vidare: - Typkund 1 & 2 (Lägenhet 16A, Villa 16A): 5 metrics × 5 år = 25 kolumner - Typkund 3-6 (Villa 20A+): 6 metrics × 5 år (har Rörlig 1 + Rörlig 2)
Parsing-strategi
Använd openpyxl med data_only=True:
import openpyxl
wb = openpyxl.load_workbook("file.xlsx", read_only=True, data_only=True)
ws = wb[wb.sheetnames[0]]
for i, row in enumerate(ws.iter_rows(values_only=True)):
if i < 4: continue # skip headers
re_namn = row[0] # REL00018
company = row[1]
# Sen kolumn-offset per typkund × år
Identifiera kolumn-offset
För 2026 (första året i varje typkund-block):
| Typkund | Myndighet | Fast | Rörlig | Total | Punkter |
|---|---|---|---|---|---|
| Lägenhet 16A 2000 | D (4) | I (9) | N (14) | S (19) | X (24) |
| Villa 16A 5000 | AC (29) | AH (34) | AM (39) | AR (44) | AW (49) |
| Villa 20A 10000 | BB (54) | BG (59) | BL (64) [+BQ=Rörlig2 (69)] | BV (74) | CA (79) |
För andra år (2025=offset+1, 2024=offset+2 osv).
Gotcha: stora aktörer som Ellevio AB
Ellevio AB (EDIEL 14900) har data noll i top-level-raden. Anledning: deras taxor rapporteras per koncession (REL00509, REL00510 osv) — inte aggregerat. Sammanfoga manuellt eller använd fuzzy-match mot grid_owners-namn.
Mappa till EDIEL-ID
REL-koden är Ei:s identifierare för en nätkoncession, inte samma som EDIEL-ID. Bästa fuzzy-match:
UPDATE ei_grid_tariffs t SET matched_ediel_id = g.ediel_id
FROM grid_owners g
WHERE similarity(lower(t.company_name), lower(g.name)) > 0.7
AND t.matched_ediel_id IS NULL;
Sync-frekvens
Filerna uppdateras ungefär 1 gång/år (efter 1 januari när nya avgifter offentliggjorts). Veckosync räcker — eller manuell vid känd uppdatering.