Don’t pay too much attention to headlines about record wind farm output. Here’s why!

Posted on Updated on

How do you measure performance?

Do we measure the qualities of a golfer by that one time he won a major championship?

Do we assess the ability of Whigfield to knock out a hit record by that mega-seller Saturday Night?

Do we measure the arrival time of a tardy colleague by that one time she had a meeting at 8.30 am?

I think you would agree we don’t. Yet, when it comes to renewable energy a large number of people seem to think the above approach will do.

All we want to talk about is that day solar panels or wind farms produced an awful lot of electricity. The solar panels might, quite literally, be producing zero power the second people tweet, Facebook, or otherwise share, silly stories about Germany producing half of its energy from solar panels, but this apparently will not stop some people from sharing what should be obvious nonsense.

Renewable energy, such as that produced by wind farms and solar panels, is intermittent. Or, as some now want it, they are “variable” – a curious linguistic intervention, which seems to ignore that we humans can’t do the varying.

What we should really care about are not peaks, but the averages. The lows, of course, are rather predictable. Solar panels produce a reliable volume of electricity at midnight, while the aggregated output of wind farms on the scale of individual countries will, not infrequently, go very close to zero.

The peaks (and troughs), you see, aren’t something to celebrate, they are something that will prove a massive challenge in years to come.

Take this tweet from prominent climate change activist Bill McKibben:

Yes, we should applaud Denmark for achieving this. But here is the problem. Denmark is unique in being able to achieve this. Most countries do not have the interconnector capacity to export this much electricity. Considering the exports and imports crossing Denmark’s interconnectors at this time, which is just under 4 gigawatts. This represents a total import/export capacity which is greater than the total capacity of Britain, and Britain consumes ten times more electricity than Denmark.

And what about a future where not only Denmark, but its neighbours, want to export their excess wind power output? Who will be the takers then?

Denmark’s is not a model that is easily followed.

But what about the mean wind farm output? Typically, this is around one third of the peak.

We can calculate this relatively easily for the many European countries that produce hourly aggregated output data for its wind farms.

And the data is clear. Mean wind farm output is typically between 2.5 and 5 times less than peak output.

Here is the ratio between the maximum and mean output for 6 European countries for a number of years since 2006:


So Denmark’s peaks are typically about 3 times greater than its means.

And look at Germany. Many people like to talk about record renewables output in Germany, but they rarely bother to state what the average is. Remarkably, German peak wind farm output is always at least 4.5 times the mean. Keep this in mind next time you see a headline about record German wind farm output.

If you ignore Germany, you can probably settle on an approximate rule of thumb: peak wind farm output will be roughly 3 times the average.

Note on data and calculations

The data for the figure above comes from the website of PF Bach, who has collated wind farm data from national sources. Code, in the statistical language R, to produce the figure is shown below.

### Packages required

### Download all of the wind related time series files from and chuck them in a folder
### The code should also work if you download all of the excel files
setwd("~/PF_Bach/")    ## Rename appropriately
options(stringsAsFactors = F)
### Get a list of the files in the folder and then remove stuff we don't need
windFiles <- data.frame(File = list.files(), stringsAsFactors = F)
windFiles <- subset(windFiles, str_detect(File, "wind"))
windFiles <- subset(windFiles, str_detect(File, "_tennet_wind.xls") != T)
windFiles <- subset(windFiles, str_detect(File, "50hertz") != T)
windFiles <- subset(windFiles, str_detect(File, "dke") != T)
windFiles <- subset(windFiles, str_detect(File, "amprion") != T)
windFiles <- subset(windFiles, str_detect(File, "transnetbw") != T)
windFiles <- subset(windFiles, str_detect(File, "dwk") != T)

tracker <- 1             ### tracker just to make it easy to combine files
## Loop through all years and then all files
for(yy in 2006:2014)
  for(i in 1:nrow(windFiles))
  ### Only read in that year's files
    if(str_detect(windFiles[i,1], toString(yy)))
  ## Read in the raw data, rename and then tidy
    raw <- read.xls(windFiles[i,1], skip = 2)
    names(raw) <- c("Date", "Hour", "Wind")
    raw <- data.frame(Day = day(dmy(raw$Date)), Month = month(dmy(raw$Date)), Wind = raw$Wind)
  ## Set up the data frame which will have all of the data from the files in one dataframe
    if(tracker == 1)
      comp.Wind <- data.frame(raw, Year = yy, Country = substr(windFiles[i,1],6, str_locate_all(windFiles[i,1],"_")[[1]][2] )) else
        comp.Wind <- rbind(comp.Wind, data.frame(raw, Year = yy, Country = substr(windFiles[i,1],6, str_locate_all(windFiles[i,1],"_")[[1]][2] )))
     tracker <- tracker + 1

### Get a list of the code names for the countries and then use their actual names. Then combine the files
country.change <- data.frame(Country = c("b", "cz", "de", "dk", "e", "eirgrid", "f", "gb", "sf"),
                             NewName = c("Belgium", "Czech Republic", "Germany", "Denmark", "Spain", "Ireland", "France", "United Kingdom", "Finland"))

comp.Wind <- join(comp.Wind, country.change)
comp.Wind <- subset(newData, !
comp.Wind <- data.frame(comp.Wind[,c(1:4)], Country = comp.Wind$NewName)

### Remove Finland and Czech Republic. Very little data
comp.Wind <- subset(comp.Wind, Country %in% c("Finland","Belgium", "Czech Republic") != T)
## Calculate maximum and mean output in each year and country and then compare them
wind.max <- aggregate(comp.Wind, by = list(comp.Wind$Year, comp.Wind$Country), FUN = max)
wind.mean <- aggregate(comp.Wind, by = list(comp.Wind$Year, comp.Wind$Country), FUN = mean)

max_mean <- data.frame(Country = wind.max[,2],Wind = wind.max[,5]/wind.mean[,5], Year = wind.max[,1])

### Change United Kingdom to UK to make the plot neater

max_mean$Country[max_mean$Country == "United Kingdom"] <- "UK"

## Plot the data
gg <- ggplot(max_mean, aes(Country, Wind, fill = factor(Year)))+
  geom_bar(stat = "identity", position="dodge")+
  ylab("Ratio between maximum and\nmean wind farm output")+
  theme_grey(base_size = 16)+
  theme(legend.title = element_blank())+