A package to simplify working with EFA blocks and settlement periods in the GB electricity trading system.
This package can be installed via pip:
$ pip install efaciency
Define a settlement period and get the corresponding half-hour datetime.
>>> from datetime import date
>>> from efaciency import SettlementPeriod
>>> sp = SettlementPeriod(settlement_date=date(2023, 7, 1), settlement_period=24)
>>> sp["ts"]
datetime.datetime(2023, 7, 1, 11, 30, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>)
Get the corresponding EFA information and settlement information for a given timestamp.
>>> from datetime import datetime
>>> from efaciency import SettlementPeriod
>>> sp = SettlementPeriod(ts=datetime(2023, 7, 1, 11, 30))
>>> sp
{
'settlement_date': datetime.date(2023, 7, 1)
'settlement_period': 24,
'ts': datetime.datetime(2023, 7, 1, 11, 30, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>),
'efa_date': datetime.date(2023, 7, 1),
'efa_block': 4,
}
Create half-hourly range for all SPs in between two dates.
>>> from datetime import date
>>> from efaciency import settlement_period_range
>>> sp_range = settlement_period_range(
... from_efa_date=date(2023, 7, 1),
... to_efa_date=date(2023, 7, 2),
... )
>>> sp_range[0]
{
'settlement_date': datetime.date(2023, 6, 30)
'settlement_period': 47,
'ts': datetime.datetime(2023, 6, 30, 23, 0, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>),
'efa_date': datetime.date(2023, 7, 1),
'efa_block': 1
}
Define EFA blocks and get the corresponding start and end datetimes.
>>> from datetime import date
>>> from efaciency import EFABlock
>>> efa = EFABlock(efa_date=date(2023, 7, 1), efa_block=3)
>>> efa["start_ts"].strftime("%Y-%m-%d %H:%M")
'2023-07-01 07:00'
>>> efa["end_ts"].strftime("%Y-%m-%d %H:%M")
'2023-07-01 11:00'
Create a range of all EFA blocks between two dates.
>>> from datetime import date
>>> from efaciency import efa_block_range
>>> efa_range = efa_block_range(date(2023, 7, 1), date(2023, 7, 2))
>>> efa_range[0]
{
'efa_date': datetime.date(2023, 7, 1),
'efa_block': 1,
'start_ts': datetime.datetime(2023, 6, 30, 23, 0, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>),
'end_ts': datetime.datetime(2023, 7, 1, 3, 0, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>),
}
Please make a pull request or log an issue on GitHub.
Code is released as free software under the MIT License (see LICENSE
file).