Use DNSP data
nemdb collects zone substation (ZSS) load data from distribution network service providers across the NEM.
Available DNSPs
| DNSP | State | Module |
|---|---|---|
| Ausgrid | NSW | nemdb.dnsp.ausgrid |
| Endeavour Energy | NSW | nemdb.dnsp.endeavour |
| Essential Energy | NSW | nemdb.dnsp.essential_energy |
| CitiPower & Powercor | VIC | nemdb.dnsp.cppal |
| Jemena | VIC | nemdb.dnsp.jemena |
| United Energy | VIC | nemdb.dnsp.united_energy |
| Energex | QLD | nemdb.dnsp.energex |
| Ergon Energy | QLD | nemdb.dnsp.ergon |
| SA Power Networks | SA | nemdb.dnsp.sapn |
| TasNetworks | TAS | nemdb.dnsp.tasnetworks |
Download ZSS data
Via NEMWEBManager
ZSS data is integrated into NEMWEBManager as the ZONE_SUBSTATION table:
from nemdb import NEMWEBManager, Config
Config.set_cache_dir("./data")
nemweb = NEMWEBManager(Config)
# Download ZSS data for a date range
nemweb.ZONE_SUBSTATION.populate(slice("2024-01-01", "2024-12-31"))
# Scan as a LazyFrame
lf = nemweb.ZONE_SUBSTATION.scan()
Directly from a DNSP module
from nemdb.dnsp import ausgrid
df = ausgrid.read_all_zss(2024)
print(df.head())
Each DNSP module provides:
get_url(year)-- returns the download URL for a given year (orNoneif unavailable)read_all_zss(year)-- downloads, parses, and returns a Polars DataFrame
Read all DNSPs at once
from nemdb.dnsp.dnsp import read_all_zss
for network_name, df in read_all_zss(2024):
print(f"{network_name}: {len(df)} rows")
Data schema
All DNSP data is normalised to a common schema:
| Column | Type | Description |
|---|---|---|
zss |
String | Zone substation name |
time |
Datetime | Timestamp (typically half-hourly) |
MW |
Float | Load in megawatts |
When loaded via NEMWEBManager, the data is partitioned by network (DNSP name) and year.
Data availability
Data availability varies by DNSP and year. Not all DNSPs publish data for all years. If a DNSP's data is unavailable for a requested year, get_url() returns None and the download is skipped with a log message.