Monate chronologisch ordnen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Monate chronologisch ordnen

Beitrag von jessi »

Hallo liebes Forum-Team,

ich habe Tagesmitteltemperaturen und möchte diese in Monatsmittelwerten zusammenfassen - soweit so gut. Das hat auch funktioniert, gemacht habe ich es folgenderweise:

Code: Alles auswählen

tm <- read.csv(tmittel_tag.csv", sep = ";", dec = ",", header = TRUE)

### str(tm)
###### 'data.frame':   5475 obs. of  2 variables:
###### $ Datum    : Factor w/ 21549 levels "1999-01-01",..: 1 2 3 4 5 6 7 8 9 10 ...
###### $ Tmittel  : num  -1.6 -1.8 -1.9 -1.5 -0.4 -2.2 -2.9 -0.3 2.5 1 ...
 	
### factor Datum in date umwandeln 
tm$Datum <- as.Date(tm$Datum)

### spalte Datum in Jahr, Monat und Tag auf
tm$Monat <- months(tm$Datum)
tm$Jahr <- format(tm$Datum, format = "%Y")
tm$Tag <- format(tm$Datum, format = "%d")

### Berechne Monatsmittelwerte nach Monat und Jahr 
T_mm <- aggregate(tm$Tmittel ~ tm$Monat + tm$Jahr, tm, FUN = mean) 

Nur werden jetzt die Monate Alphabetisch geordnet, da ich allerdings den zeitlichen Verlauf plotten möchte, benötige ich T_mm chronologisch geordnet nach

Jänner 2011 0.09032258
Februar 2011 1.98
März 2011 3.23
...

Jänner 2018 1.01
Februar 2018 2.42
...

Kann mir hier jemand weiterhelfen, wie ich das am besten lösen?

Danke und sonnige Grüße
Jessi
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Monate chronologisch ordnen

Beitrag von jogo »

Hallo Jessi,

wo kommen denn die Monatsnamen her? Werden die von der Funktion months() produziert?
Ich empfehle, gleich in den Dataframe tm eine Spalte für die Nummer des Monats aufzunehmen (oder eventuell gleich kombiniert mit dem Jahr).

Code: Alles auswählen

tm$xMonat <- substr(tm$Datum, 1, 7)
Beim aggregate kannst Du es noch bequemer haben:

Code: Alles auswählen

T_mm <- aggregate(Tmittel ~ Monat + Jahr, data=tm, FUN = mean)
in der neuen Variante:

Code: Alles auswählen

T_mm <- aggregate(Tmittel ~ xMonat, data=tm, FUN = mean)
Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Monate chronologisch ordnen

Beitrag von jessi »

Hallo Jörg,

danke für deine schnelle Antwort.
wo kommen denn die Monatsnamen her? Werden die von der Funktion months() produziert?
Die Monatsnamen hat die Funktion months() erstellt, da kam nichts von mir.

Ich werde das gleich noch umbauen, danke :)

Jetzt hat sich gleich auch noch ein anderes Problem aufgetan. Zusätzlich zu den Jahresmittelwerten möchte ich auch die Mittelwerte der Saisonen bestimmen. Allerdings überschreitet die Wintersaison das Jahr. Gibt es einen Befehl in R, dass die z.B. Monate Dezember 1998, Jänner 1999 und Februar 1999 gemittelt werden, also der Dezember aus dem Vorjahr? Mit dem jetzigen Befehl werden über die Jahre gemittelt, also Jänner, Feburar und Dezember aus 1999. Zuvor habe ich mittels des Befehls "subset" den Datensatz nur mit den jeweiligen Monaten (DJF, MAM, ...) zusammengefasst.

Danke nochmals.
Grüße
Jessi
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Monate chronologisch ordnen

Beitrag von jogo »

Hallo Jessi,

wenn es um arithmetische Mittel für die Saisonen geht, so kannst Du die aus den Monatsmittelwerten berechnen.
Die korrekte Gruppierungsvariable musst Du Dir passend erstellen und in die Tabelle packen.

Code: Alles auswählen

paste0(rep(1998:2001, each=4), c(".1F", ".2S", ".3H", ".4W"))
Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Monate chronologisch ordnen

Beitrag von jessi »

Hallo Jörg,

danke für deine Antwort.
Ja es geht um das arithmetische Mittel der Saison.
Leider verstehe ich deine Antwort nicht so ganz. Wie kann ich mir die Saison Winter erstellen? Und wie kann ich R sagen, dass das Monat Dezember aus dem Jahr davor herangezogen werden soll.

Irgendwie stehe ich da gerade etwas auf der Leitung?

Danke für weitere Tipps.

Grüße
Jessi
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Monate chronologisch ordnen

Beitrag von jogo »

Hallo Jessi,

wenn Du mir ein reproduzierbares Beispiel lieferst, kann ich es Dir vorführen.
viewtopic.php?f=20&t=11
oder auch
https://stackoverflow.com/questions/596 ... le-example

Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Monate chronologisch ordnen

Beitrag von jessi »

Hallo Jörg,

ich habe unten einen Datensatz erzeugt, danach Jahr und Monat aufgespalten und die drei benötigten Monaten erzeugt.
Für Dezember, Jänner und Februar habe ich dann jeweils den Mittelwert berechneten und anschließend habe ich die Wintersaison definiert mit zB. Dezember-Mittel 1999, Jänner-Mittel 2000, Februar-Mittel 2000. Mit der for-Schleife über den gesamten Zeitraum. Jetzt weiß ich allerdings nicht mehr weiter ...
Ev. kannst du nochmals aushelfen :oops:

Code: Alles auswählen

 df <- data.frame(date = seq(from = as.Date("1991-01-01"),
                             to = as.Date("2009-12-31"),
                             by = "day"))
 df$vals <- rnorm(nrow(df))

 df$year <- format(df$date, "%Y")
 df$month <- format(df$date, "%m")
df$month <- as.integer(df$month)

jan <- subset(df, df$month==1)
feb <- subset(df, df$month==2)
dez <- subset(df, df$month==12)

##Bilde Monatsmittelwerte 
dez_mean <- aggregate(dez$vals ~ year, dez, FUN = mean)
jan_mean <- aggregate(jan$vals ~ year, jan, FUN = mean)
feb_mean <- aggregate(feb$vals ~ year, feb, FUN = mean)

colnames(dez_mean) <- c("year", "mittel")
colnames(jan_mean) <- c("year", "mittel")
colnames(feb_mean) <- c("year", "mittel")

## Wintersaison definiert
winter <- data.frame(dez_mean[1,], jan_mean[2,],feb_mean[2,])
mittel_winter <- mean(winter$mittel)


winter <- data.frame(name = character(0), len=numeric(0))
for (i in 1:length(feb_mean$year)){
   winter <- rbind(winter, data.frame(dez_mean[i,], jan_mean[i+1,],feb_mean[i+1,])) }
   
colnames(winter) <- c("year_d", "dez_mittel", "year_j", "jan_mittel", "year_f", "feb_mittel")
Danke!
Grüße Jessi
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Monate chronologisch ordnen

Beitrag von Athomas »

So schwer ist es doch nicht: Du musst nur gucken, dass der Dezember des Jahres 1999 mit dem Januar und Februar des Folgejahres in einer Gruppe landet - mit einem einheitlichen Gruppennamen.

Der könnte z.B. "Winter 1999/2000" lauten.

Du könntest für die Dezembermonate etwa

Code: Alles auswählen

paste0("Winter ", Jahr, "/", Jahr + 1)
und für Januare und Februare

Code: Alles auswählen

paste0("Winter ", Jahr - 1, "/", Jahr)
berechnen, und - voila - haben diese Monate den passenden Saisonnamen!
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Monate chronologisch ordnen

Beitrag von jogo »

Hallo Jessi,

so etwa:

Code: Alles auswählen

df <- data.frame(date = seq(from = as.Date("1991-01-01"), to = as.Date("2009-12-31"), by = "day"))
set.seed(42)
df$vals <- rnorm(nrow(df))

df$year <- format(df$date, "%Y")
df$month <- format(df$date, "%m")
df$monthi <- as.integer(df$month)
df$ym <- sprintf("%s.%02d", df$year, df$monthi)

### wenn Du wirklich sowas machen willst, dann M <- split(df, df$month)
### ... aber in diesem Fall solltest Du das nicht wollen, sondern die Daten beisammen halten.
# jan <- subset(df, df$month==1)
# feb <- subset(df, df$month==2)
# dez <- subset(df, df$month==12)

##Bilde Monatsmittelwerte 
dfmean <- aggregate(vals ~ ym, data=df, FUN=mean)
dfmean <- within(dfmean, { monthi <- as.integer(substr(ym, 6, 7)); year <- as.integer(substr(ym, 1, 4)) })
# dez_mean <- aggregate(dez$vals ~ year, dez, FUN = mean)
# jan_mean <- aggregate(jan$vals ~ year, jan, FUN = mean)
# feb_mean <- aggregate(feb$vals ~ year, feb, FUN = mean)

S <- rep(c("1.Winter", "2.Frühling", "3.Sommer", "4.Herbst", "1.Winter"), c(2, 3, 3, 3, 1))
dfmean$saison <- S[dfmean$monthi]

dfmean$syear <- ifelse(dfmean$monthi==12, dfmean$year + 1, dfmean$year)
dfmean$ysaison <- sprintf("%d.%s", dfmean$syear, dfmean$saison)
dfmean[1:20,]

aggregate(vals ~ ysaison, data=dfmean, FUN=mean)
Gruß, Jörg
Antworten