Skip to main content
Python Software Foundation 20th Year Anniversary Fundraiser  Donate today!

Parse NEM12 and NEM13 metering data files

Project description


PyPI version Python package Coverage Status

The Australian Energy Market Operator (AEMO) defines a Meter Data File Format (MDFF) for reading energy billing data. This library sets out to parse these NEM12 (interval metering data) and NEM13 (accumulated metering data) data files into a useful python object, for use in other projects.


First, read in the NEM file:

from nemreader import read_nem_file
m = read_nem_file('examples/unzipped/Example_NEM12_actual_interval.csv')

You can see what data for the NMI and suffix (channel) is available:

> print(m.header)
HeaderRecord(version_header='NEM12', creation_date=datetime.datetime(2004, 4, 20, 13, 0), from_participant='MDA1', to_participant='Ret1')

> print(m.transactions)
{'VABD000163': {'E1': [], 'Q1': []}}

Standard suffix/channels are defined in the National Metering Identifier Procedure. E1 is the general consumption channel (11 for NEM13).

Most importantly, you will want to get the energy data itself:

> for nmi in m.readings:
>     for channel in m.readings[nmi]:
>         for reading in m.readings[nmi][suffix][-1:]:
>             print(reading)
Reading(t_start=datetime.datetime(2004, 4, 17, 23, 30), t_end=datetime.datetime(2004, 4, 18, 0, 0), read_value=14.733, uom='kWh', quality_method='S14', event='', read_start=None, read_end=None)

Command Line Usage

You can also output the NEM file in a more human readable format:

nemreader output

Which outputs transposed values to a csv file for all channels:

2004-02-01 00:00:00,2004-02-01 00:30:00,1.111,2.222,A
2004-02-01 00:30:00,2004-02-01 01:00:00,1.111,2.222,A


You can easily chart the usage data using pandas:

import matplotlib.pyplot as plt
from nemreader import output_as_data_frames

# Setup Pandas DataFrame
dfs = output_as_data_frames("examples/nem12/")
nmi, df = dfs[0] # Return data for first NMI in file
df.set_index("period_start", inplace=True)

# Chart time of day profile
hourly = df.groupby([(df.index.hour)]).sum()
plot = hourly.plot(title=nmi, kind="bar", y=["E1"])

"Time of day plot"

Or even generate a calendar with daily usage totals:

# Chart daily usage calendar
import pandas as pd
import calmap
plot = calmap.calendarplot(pd.Series(df.E1), daylabels="MTWTFSS")

"Calendar Plot"

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for nemreader, version 0.5.2
Filename, size File type Python version Upload date Hashes
Filename, size nemreader-0.5.2-py3-none-any.whl (12.4 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size nemreader-0.5.2.tar.gz (12.8 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page