2017-01-03 1 views
1

Ich habe zwei Spalten-Datensatz: Date und Ozone. Zeitreihen sind unregelmäßige Stundenwerte, ich muss tägliche Durchschnittsdaten berechnen.Berechnen Sie den Tagesmittelwert aus unregelmäßigen stündlichen Daten mit xts

Mein Problem ist die letzte Datei hat nur einen Wert anstelle der ganzen Ozone Spalte. Ich habe verschiedene Versionen ausprobiert, aber ich kann das Problem nicht lösen.

dataset1 <- structure(list(Date = structure(1:3, .Label = c("7/11/2013 18:33", 
    "7/11/2013 18:34", "7/11/2013 18:35"), class = "factor"), ozone = c(40.7, 40.4, 
    40.9)), .Names = c("Date", "ozone"), row.names = c(NA, 3L), class = "data.frame") 
#convert dataframe to xts object 
library(xts) 
xt1 <- xts(dataset1[,-1], 
      order.by = as.POSIXct(dataset1$Date, format= "%m/%d/%Y %H:%M")) 
x_updated <- apply.daily(xt1, colMeans) 
#convert back the dataset to data.frame 
write.csv(as.data.frame(x_updated), file="daily") 
+0

@DarshanBaral sicher, dataset1 <- Struktur (Liste (X = 1: 3, Date = Struktur (1: 3, c = .LABEL ("2013.07.11 18.33", „7/11/2013 18:34 "," 7/11/2013 18:35 "), class =" faktor "), ozon = c (40,7, 40,4, 40,9)), .Names = c (" X ", "Datum", "Ozon"), row.names = c (NA, 3L), class = "data.frame") – nil

Antwort

1

Hier ist die dplyr Lösung:

library(dplyr) 

df2 <- dataset1 %>% 
    mutate(date2 = as.Date(dataset1$Date)) %>% 
    group_by(date2) %>% 
    mutate(avg_ozone = mean(ozone)) %>% 
    select(Date, ozone, avg_ozone) 
+0

Vielen Dank für diese alternative Lösung! – nil

1
# Get 'day' from 'datetime' 
# dataset1$day = as.POSIXct(dataset1$Date, format='%d/%m/%Y') # Apparently this caused problem 
dataset1$day = do.call(rbind, strsplit(as.character(dataset1$Date)," "))[,1] 

# Get Daily Averages 
daily_averages = aggregate(ozone~day, dataset1, mean) 
+1

Danke! es ist gelöst. – nil

+0

Ich habe gerade festgestellt, dass dieser Ansatz keine richtigen Lösungen liefert, Daten sind gemischt. Beispiel: Das erste Datum in der Originaldatei ist der 11.7.2013, die durchschnittlichen Tagesdaten beginnen am 01.08.2013. – nil

+1

Ich löste es auf diese Weise: Tag = as.POSIXct (Dataset1 $ Datum, Format = "% m /% d /% Y") täglich <- Aggregat (Dataset1 [, 1: 3], von = Liste (Tag), bedeutet) Danke für Ihre Hilfe! – nil

1

Es gibt nichts in Ihrem reproduzierbaren Beispiel, das mir schon sagt, dass es ein Problem mit dem Ausgang sein (nachdem ich die Fehler in der korrigierte format Argument zu Ihrem as.POSIXct Anruf - es war ursprünglich "%m\%d\%y %H:%M"). Das heißt, Ihr Beispiel hatte nur einen Tag Daten, also sollte es nur eine Zeile der Ausgabe in der Datei haben.

Hier ist ein reproduzierbares Beispiel, das zeigt, dass die "tägliche" Datei mehr als eine Beobachtung hat.

# re-create example data 
set.seed(21) 
Data <- data.frame(Date=seq(ISOdate(2017, 1, 1), ISOdate(2017, 1, 3), by="hours")) 
Data$Ozone <- rnorm(NROW(Data)) 
Data$Date <- format(Data$Date, "%m/%d/%Y %H:%M") 
# convert to xts 
library(xts) 
xt1 <- xts(Data[,-1], as.POSIXct(Data$Date, format="%m/%d/%Y %H:%M")) 
x_updated <- apply.daily(xt1, colMeans) 
# convert to data.frame 
write.csv(as.data.frame(x_updated)) 
# "","V1" 
# "2017-01-01 23:00:00",0.038108046611944 
# "2017-01-02 23:00:00",-0.0380170075916872 
# "2017-01-03 12:00:00",0.612294079665861 
Verwandte Themen