| Title: | BDEW Standard Load Profiles for Electricity |
|---|---|
| Description: | Provides representative standard load profiles (SLPs) for electricity published by the German Association of Energy and Water Industries (BDEW Bundesverband der Energie- und Wasserwirtschaft e.V.) in a tidy format. Covers the 1999 profiles — households (H0), commerce (G0–G6), and agriculture (L0–L2) — and the updated 2025 profiles (H25, G25, L25, P25, S25), which additionally represent households with photovoltaic systems and battery storage. Also provides an interface for generating a standard load profile over a user-defined date range. The 1999 data and methodology are described in VDEW (1999), "Repräsentative VDEW-Lastprofile", <https://www.bdew.de/media/documents/1999_Repraesentative-VDEW-Lastprofile.pdf>. The generation algorithm is described in VDEW (2000), "Anwendung der Repräsentativen VDEW-Lastprofile step-by-step", <https://www.bdew.de/media/documents/2000131_Anwendung-repraesentativen_Lastprofile-Step-by-step.pdf>. The 2025 profiles are described in BDEW (2025), "Standardlastprofile Strom", <https://www.bdew.de/energie/standardlastprofile-strom/>. |
| Authors: | Markus Döring [aut, cre, cph] |
| Maintainer: | Markus Döring <[email protected]> |
| License: | CC0 |
| Version: | 1.1.0.9000 |
| Built: | 2026-04-15 08:26:56 UTC |
| Source: | https://github.com/flrd/standardlastprofile |
Data about representative, standard load profiles for electricity from the German Association of Energy and Water Industries (BDEW Bundesverband der Energie- und Wasserwirtschaft e.V.) in a tidy format.
slpslp
A data.frame with 26,784 observations and 5 variables:
character, identifier for load profile, see 'Details'
character, one of 'summer', 'winter', 'transition' for
1999 profiles; one of 'january' through 'december' for 2025 profiles
character, one of 'saturday', 'sunday', 'workday'
character, format: %H:%M
numeric, electric power in watts, normalised to 1,000 kWh/a
There are 96 x 1/4h measurements of electrical power for each combination
of profile_id, period and day, which we refer to as the "standard load
profile".
In total there are 16 profile_id across two generations of profiles:
1999 profiles (based on analysis of 1,209 load profiles of low-voltage electricity consumers in Germany):
Households: H0
Commercial: G0, G1, G2, G3, G4, G5, G6
Agriculture: L0, L1, L2
2025 profiles (updated profiles published by BDEW in 2025):
Households: H25
Commercial: G25
Agriculture: L25
Combination profile PV: P25
Combination profile storage and PV: S25
The 2025 profiles use calendar months rather than seasons for the period
column ('january' through 'december').
Call slp_info() for more information and examples.
Period definitions (1999 profiles):
summer: May 15 to September 14
winter: November 1 to March 20
transition: March 21 to May 14, and September 15 to October 31
Day definitions:
workday: Monday to Friday
saturday: Saturdays; Dec 24th and Dec 31st are also treated as Saturdays
unless they fall on a Sunday
sunday: Sundays and all public holidays
Units and normalisation:
The source Excel file for the 1999 profiles stores values in watts (W), normalised to an annual consumption of 1,000 kWh/a. The source Excel file for the 2025 profiles stores values in kilowatt-hours (kWh) per 15-minute interval, normalised to 1,000,000 kWh/a. To keep the internal representation consistent and backwards compatible, all 2025 values have been converted to watts normalised to 1,000 kWh/a.
As a result, the watts column in both this dataset and the output of
slp_generate() always represents average electric power in watts,
normalised to 1,000 kWh/a. To convert to energy consumed per 15-minute
interval in kWh, divide by 4 and by 1,000:
watts_to_kwh <- \(x) x / 4 / 1000
https://www.bdew.de/energie/standardlastprofile-strom/
https://www.bdew.de/media/documents/Profile.zip
https://www.bdew.de/media/documents/1999_Repraesentative-VDEW-Lastprofile.pdf
head(slp)head(slp)
Generate a standard load profile in watts, normalised to an annual consumption of 1,000 kWh.
slp_generate( profile_id, start_date, end_date, holidays = NULL, state_code = deprecated() )slp_generate( profile_id, start_date, end_date, holidays = NULL, state_code = deprecated() )
profile_id |
load profile identifier, required |
start_date |
start date in ISO 8601 format, greater than or equal
to |
end_date |
end date in ISO 8601 format, no later than
|
holidays |
an optional character or Date vector of dates in ISO 8601
format ( |
state_code |
In the German electricity market, a standard load profile is a
representative pattern of electricity consumption used to forecast demand
for customer groups that are not continuously metered. For each distinct
combination of profile_id, period, and day there are 96 quarter-hourly
measurements of electrical power, normalised to an annual consumption of
1,000 kWh. This function supports data from 1990 to 2073.
See vignette("standardlastprofile") for more details about the algorithm.
There are 16 profile IDs across two generations:
1999 profiles:
H0: Households
G0, G1, G2, G3, G4, G5, G6: Commercial
L0, L1, L2: Agriculture
2025 profiles
In 2025, BDEW published an updated set of standard load profiles reflecting changes in electricity consumption patterns since the original 1999 study. Five new profiles are included:
H25: households — updated version of H0
G25: commerce (general) — updated version of G0
L25: agriculture — updated version of L0
P25: combination profile for households with a photovoltaic (PV) system
S25: combination profile for households with a PV system and battery storage
For descriptions of each profile, call slp_info().
1999 profiles use three seasonal periods:
summer: May 15 to September 14
winter: November 1 to March 20
transition: March 21 to May 14, and September 15 to October 31
2025 profiles use calendar months (january … december) instead of
seasons.
Within each period, days are classified as:
workday: Monday to Friday
saturday: Saturdays; Dec 24th and Dec 31st are also treated as Saturdays
unless they fall on a Sunday
sunday: Sundays and all public holidays
By default, the following nine public holidays observed nationwide across all German states are treated as Sundays:
New Year's Day (1 January)
Good Friday
Easter Monday
Labour Day (1 May)
Ascension Day
Whit Monday
German Unity Day (3 October)
Christmas Day (25 December)
Boxing Day (26 December)
State-level holidays are not included by default. These vary by state
and can change — for example, Berlin observed a one-time holiday on
8 May 2025 (end of World War II anniversary). Use the holidays argument
to supply your own dates instead; the built-in data are then ignored
entirely.
The 1999 source file stores values in watts (W), normalised to 1,000 kWh/a. The 2025 source file stores values in kWh per 15-minute interval, normalised to 1,000,000 kWh/a. To keep all profiles consistent, the 2025 values are converted to watts normalised to 1,000 kWh/a.
To convert to energy consumed per interval in kWh:
kwh <- out$watts / 4 / 1000
A data.frame with four variables:
profile_id, character, load profile identifier
start_time, POSIXct / POSIXlt, start time
end_time, POSIXct / POSIXlt, end time
watts, numeric, average electric power in watts per 15-minute interval,
normalised to an annual consumption of 1,000 kWh
https://www.bdew.de/energie/standardlastprofile-strom/
https://www.bdew.de/media/documents/1999_Repraesentative-VDEW-Lastprofile.pdf
https://www.bdew.de/media/documents/2000131_Anwendung-repraesentativen_Lastprofile-Step-by-step.pdf
start <- "2026-01-01" end <- "2026-12-31" # multiple profile IDs are supported L <- slp_generate(c("L0", "L1", "L2"), start, end) head(L) # supply custom holiday dates (e.g. only treat New Year's Day as a holiday) H0_custom <- slp_generate("H0", start, end, holidays = "2026-01-01") # Fetch state-level holidays from the nager.Date API and pass them in. # Each entry in the API response contains two relevant fields: # $global — logical; TRUE = nationwide holiday, FALSE = state-specific # $counties — list of ISO 3166-2 state codes (e.g. "DE-BE" for Berlin) # when global is FALSE; NULL otherwise # # Berlin (DE-BE) observes International Women's Day (March 8) in addition # to all nationwide holidays. The example below fetches 2027 holidays, # keeps entries where global is TRUE or "DE-BE" appears in counties, and # passes the resulting dates to slp_generate(). ## Not run: resp <- httr2::request("https://date.nager.at/api/v3") |> httr2::req_url_path_append("PublicHolidays", "2027", "DE") |> httr2::req_perform() |> httr2::resp_body_json() is_berlin <- \(x) isTRUE(x$global) || "DE-BE" %in% unlist(x$counties) holidays_berlin_2027 <- as.Date( vapply(Filter(is_berlin, resp), \(x) x$date, character(1)) ) H0_berlin_2027 <- slp_generate( "H0", "2027-01-01", "2027-12-31", holidays = holidays_berlin_2027 ) ## End(Not run) # consider only nationwide public holidays (default) H0_2026 <- slp_generate("H0", start, end) # when the deprecated state_code and holidays are both supplied, both sets # of dates are treated as Sundays: user-provided dates from holidays and # state-specific built-in holidays from state_code are merged suppressWarnings( slp_generate("G0", "2026-04-01", "2026-04-01", state_code = "SL", holidays = "2026-04-01") |> head() ) # electric power values are normalised to consumption of ~1,000 kWh/a sum(H0_2026$watts / 4 / 1000) # convert watts to kWh per interval using a wrapper slp_generate_kwh <- \(...) { out <- slp_generate(...) out$kwh <- out$watts / 4 / 1000 out } H0_kwh <- slp_generate_kwh("H0", start, end) head(H0_kwh)start <- "2026-01-01" end <- "2026-12-31" # multiple profile IDs are supported L <- slp_generate(c("L0", "L1", "L2"), start, end) head(L) # supply custom holiday dates (e.g. only treat New Year's Day as a holiday) H0_custom <- slp_generate("H0", start, end, holidays = "2026-01-01") # Fetch state-level holidays from the nager.Date API and pass them in. # Each entry in the API response contains two relevant fields: # $global — logical; TRUE = nationwide holiday, FALSE = state-specific # $counties — list of ISO 3166-2 state codes (e.g. "DE-BE" for Berlin) # when global is FALSE; NULL otherwise # # Berlin (DE-BE) observes International Women's Day (March 8) in addition # to all nationwide holidays. The example below fetches 2027 holidays, # keeps entries where global is TRUE or "DE-BE" appears in counties, and # passes the resulting dates to slp_generate(). ## Not run: resp <- httr2::request("https://date.nager.at/api/v3") |> httr2::req_url_path_append("PublicHolidays", "2027", "DE") |> httr2::req_perform() |> httr2::resp_body_json() is_berlin <- \(x) isTRUE(x$global) || "DE-BE" %in% unlist(x$counties) holidays_berlin_2027 <- as.Date( vapply(Filter(is_berlin, resp), \(x) x$date, character(1)) ) H0_berlin_2027 <- slp_generate( "H0", "2027-01-01", "2027-12-31", holidays = holidays_berlin_2027 ) ## End(Not run) # consider only nationwide public holidays (default) H0_2026 <- slp_generate("H0", start, end) # when the deprecated state_code and holidays are both supplied, both sets # of dates are treated as Sundays: user-provided dates from holidays and # state-specific built-in holidays from state_code are merged suppressWarnings( slp_generate("G0", "2026-04-01", "2026-04-01", state_code = "SL", holidays = "2026-04-01") |> head() ) # electric power values are normalised to consumption of ~1,000 kWh/a sum(H0_2026$watts / 4 / 1000) # convert watts to kWh per interval using a wrapper slp_generate_kwh <- \(...) { out <- slp_generate(...) out$kwh <- out$watts / 4 / 1000 out } H0_kwh <- slp_generate_kwh("H0", start, end) head(H0_kwh)
Information and examples on standard load profiles from the German Association of Energy and Water Industries (BDEW Bundesverband der Energie- und Wasserwirtschaft e.V.)
slp_info(profile_id, language = c("EN", "DE"))slp_info(profile_id, language = c("EN", "DE"))
profile_id |
load profile identifier, required |
language |
one of |
A named list with one element per profile_id. Each element is
itself a list with three character components: profile (the identifier),
description (a short label), and details (a longer explanation).
https://www.bdew.de/energie/standardlastprofile-strom/
https://www.bdew.de/media/documents/2000131_Anwendung-repraesentativen_Lastprofile-Step-by-step.pdf
https://www.bdew.de/media/documents/Zuordnung_der_VDEW-Lastprofile_zum_Kundengruppenschluessel.pdf
slp_info("G5", language = "DE") # multiple profile IDs are supported slp_info(c("G0", "G5"))slp_info("G5", language = "DE") # multiple profile IDs are supported slp_info(c("G0", "G5"))