The National Electricity Market operates on Australian Eastern Standard Time (AEST), UTC+10, year-round. This is not the same as the wall-clock time in Sydney or Melbourne, which advance one hour to AEDT (UTC+11) during Daylight Saving Time (October to April each year).
The legal basis is NER clause 2.2.6. Using wall-clock time for any
AEMO data analysis is a common error: every summer timestamp will be
parsed one hour ahead of the file clock, and timestamps at the DST
transition boundaries will become ambiguous or NA.
The aemo package uses "Australia/Brisbane"
as the timezone for all data. Queensland observes AEST year-round (no
DST), which gives the correct fixed UTC+10 offset:
library(aemo)
# All timestamps come back in AEST (UTC+10, no DST).
# The tzone attribute is "Australia/Brisbane" throughout.
p <- aemo_price("NSW1", "2024-01-15 14:00", "2024-01-15 15:00")
attr(p$settlementdate, "tzone") # "Australia/Brisbane"
# January is summer in Australia. Australia/Sydney would give UTC+11 here,
# shifting every timestamp one hour ahead of the AEMO file clock.
# Australia/Brisbane correctly gives UTC+10.
format(p$settlementdate[1], "%Y-%m-%d %H:%M:%S %Z")To display times in local wall-clock time for a specific state, convert explicitly:
Every interval in a NEMweb file is labelled with its
period-ending timestamp. A row with
settlementdate = "2024-01-15 14:05:00" covers the 5-minute
dispatch interval from 14:00:01 to 14:05:00 (inclusive).
This is the AEMO convention throughout: the timestamp marks when the
interval closes, not when it opens. For 30-minute trading intervals the
same rule applies: a row stamped 14:30:00 covers 14:00:01
to 14:30:00.
When computing time-of-day statistics (e.g. peak demand by hour) use the interval end-time directly. When joining to external time series that use period-start timestamps, subtract the interval length:
Before 1 October 2021 the NEM settled electricity on
30-minute trading intervals using
TRADINGPRICE from the TRADINGIS reports. On that date
five-minute settlement (5MS) commenced under NER clause 3.15.1A, and
settlement moved to native 5-minute dispatch prices
from DISPATCHPRICE.
Practical implications:
| Query | What aemo_price() returns |
|---|---|
interval = "5min", any date |
Native 5-min dispatch price from DISPATCHPRICE (DISPATCHIS) |
interval = "30min", date before 2021-10-01 |
30-min TRADINGPRICE from TRADINGIS |
interval = "30min", date from 2021-10-01 |
Arithmetic mean of six 5-min dispatch prices within the trading interval |
interval = "30min", spanning 2021-10-01 |
Pre-5MS portion from TRADINGIS; post-5MS aggregated from 5-min |
When constructing long historical 30-minute price series that span the transition, the aggregation method matches: both the pre-5MS TRADINGPRICE and the post-5MS arithmetic mean are simple unweighted averages of the six dispatch prices within the trading interval (pre-5MS dispatch prices were held constant at the trading-interval price; post-5MS they vary).
DISPATCHPRICE contains two types of dispatch runs in every file:
All aemo data functions default to
intervention = FALSE, which filters to market-pricing rows
only. Pass intervention = TRUE when you need to analyse the
intervention pricing itself (e.g. the cost of directions during a
suspension period).