Karstens Blog

Wetterdaten auswerten

Author: Karsten | July 30, 2013 | 3 Minute Read

R ist eine freie Software zur statistischen Analyse, die zwar einiges an Einarbeitungszeit kostet, dafür aber leistungsfähige Funktionen zur Auswertung von Daten bietet und professionell aussehende Diagramme zeichnet. Ich habe die Software auf meine Wetterdaten losgelassen.[]{#more}[]{#more-1415}

[caption id="attachment_1417" align="alignright" width="300"]Klimadiagramm für Juli
2013{.size-medium .wp-image-1417 width=”300” height=”192”} Klimadiagramm für Juli 2013[/caption]

Die Daten der Wetterstation liegen im CSV-Format vor; die tagesaktuelle Datei stelle ich hier zur Verfügung. Sie kann direkt von der URL aus eingelesen werden. Allerdings braucht sie noch Namen und man muss R noch mitteilen, dass die Spalte "localtime" vom Typ Datum ist:

> wfrog <- read.table("http://korona.kroesch.de/meteo/wfrog-2013-07-30.csv", header=FALSE, sep=",")
> names(wfrog) <- c('timestamp', 'localtime', 'temp', 'hum', 'wind', 'wind_dir', 'wind_gust', 'wind_gust_dir', 'dew_point', 'rain', 'rain_rate', 'pressure', 'uv_index')
> wfrog$localtime <- as.POSIXct(wfrog$localtime)
> str()
$ timestamp    : int  1372491958 1372492564 1372493166 1372493768 1372494554 1372495162 1372495762 1372496364 1372496966 1372497568 ...
 $ localtime    : POSIXct, format: "2013-06-29 09:45:58" "2013-06-29 09:56:04" "2013-06-29 10:06:06" "2013-06-29 10:16:08" ...
 $ temp         : num  12.6 12.6 12.6 12.8 12.8 12.9 12.8 12.9 13 13.1 ...
 $ hum          : num  90 90 89 89 89 89 89 89 89 89 ...
 $ wind         : num  3.2 2.6 3.6 4 3.2 3.5 3.7 3.3 3.9 3.5 ...
 $ wind_dir     : num  218 223 217 217 219 ...
 $ wind_gust    : num  8.02 8.47 8.91 8.91 8.02 ...
 $ wind_gust_dir: int  216 236 216 221 232 232 217 242 244 226 ...
 $ dew_point    : num  11 11 10.8 11 11 11.1 11 11.1 11.2 11.3 ...
 $ rain         : num  0.2 0 0 0 0.2 1 0.2 0 0.2 0 ...
 $ rain_rate    : num  0 0 0 0 0 1 1.8 0 0.8 0 ...
 $ pressure     : num  1024 1024 1024 1024 1024 ...
 $ uv_index     : logi  NA NA NA NA NA NA ...

Das letzte Kommando str() zeigt die Struktur des so genannten Data Frames an. Hier überprüft man, ob die Daten für die weitere Verarbeitung korrekt sind. Für den UV-Index sind keine Daten vorhanden, weil ich den zugehörigen Sensor nicht besitze.

Liegen die Daten in einem ordentlichen Format vor, rechnet man mit Aggregatfunktionen z.B. die Tagesmittelwerte aus. Im Anschluss lässt man sich die Daten plotten und garniert sie mit Zusatzinformationen:

par(mfrow=c(1,2))

# Tagesmittelwerte
t <- aggregate(w$temp, by=list(as.Date(w$localtime)), FUN=mean, na.rm=TRUE)
plot(t, type="l", xlab="Datum", ylab="Tagestemperatur")
grid()

# Tiefpassgefilterter Trend
lines(lowess(t), col="red", lty="dashed")

# Höchst- und Tiefstwerte markieren:
names(t) <- c("day", "temp")
mind <- which(t$temp==min(t$temp))
maxd <- which(t$temp==max(t$temp))
abline(v=t$day[mind], col="blue")
abline(v=t$day[maxd], col="red")
mtext(sprintf("Temp. Minimum: %.1f °C, Maximum: %.1f °C", min(w$temp), max(w$temp)))

# Niederschlag
r <- aggregate(w$rain, by=list(as.Date(w$localtime)), FUN=sum, na.rm=TRUE)
barplot(r$x, xlab="Datum", ylab="Niederschlag", names.arg=r$Group.1)
ndtotal <- sum(w$rain)
mtext(sprintf("Niederschlag gesamt: %.1f mm", sum(w$rain)))

Die Erstellung eines solchen Skripts ist — vor allem in der Einarbeitung — mit einigem Aufwand verbunden. Danach sind aber die Grafiken für neue Messwerte auf Knopfdruck erstellt.

Für die Analyse einzelner Zeitabschnitte wandelt man die Messwerte in eine Zeitreihe um. Dies ist mit Bordmitteln relativ umständlich; einfacher geht es mit dem Paket zoo:

> z <- zoo(w$temp, order.by=as.POSIXct(w$localtime))
> jul15 <- window(z, start=as.POSIXct("2013-07-15"), end=as.POSIXct("2013-07-16"))
> plot(jul15)

Hilfreiche Seiten

Die freie Software RStudio macht die Erstellung des Skripts komfortabler als die mitgelieferte Umgebung. Der Autor von Quick-R gibt viele Rezepte auch für fortgeschrittene Themen. Hat man sich erstmal eingearbeitet, dient die Quick Reference Card als Nachschlagewerk für die tägliche Arbeit.