Wetterdaten auswerten
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"]{.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.