Come abbino i frame di dati da intervalli di tempo?
Domanda
Questo è un problema che si presenta spesso quando sto importando i dati grezzi da registratori di dati. Un registratore di temperatura è impostato a registrare la temperatura ogni dieci minuti, e un registratore separato del gas è impostato gas registro usato nell'ultimo intervallo di dieci minuti. Voglio combinare i dati provenienti da questi due taglialegna in un singolo fotogramma di dati per la stampa e l'analisi, ma i tempi non sono esattamente allineati. Voglio avere una riga nella cornice di dati per ogni periodo di dieci minuti, con il datetime che mostra l'inizio del periodo di tempo.
Gli sguardi data logger per temperatura, come:
datetime temperature 2010-09-30 06:58:53 78.996 2010-09-30 07:08:53 78.645 2010-09-30 07:18:53 78.514 2010-09-30 07:28:53 79.173 2010-09-30 07:38:53 78.602
Gli sguardi Data Logger gas come:
datetime gas 2010-09-30 13:45:00 0 2010-09-30 13:55:00 1 2010-09-30 14:05:00 0 2010-09-30 14:15:00 4 2010-09-30 14:25:00 2
Voglio combinare i fotogrammi due dati su intervalli di dieci minuti, in modo che i combinati sguardi di dati come:
datetime temperature gas 2010-09-30 13:40:00 NA 0 2010-09-30 13:50:00 78.996 1 2010-09-30 14:00:00 78.645 0 2010-09-30 14:10:00 78.514 4 2010-09-30 14:20:00 79.173 2 2010-09-30 07:38:53 78.602 NA
Ecco un po 'di codice per ottenere questi due frame di dati:
temps <- data.frame(datetime=c("2010-09-30 06:58:53",
"2010-09-30 07:08:53","2010-09-30 07:18:53",
"2010-09-30 07:28:53","2010-09-30 07:38:53"),
temperature=c(78.996,78.645,78.514,79.173,78.602),
stringsAsFactors=FALSE)
temps$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")
gas <- data.frame(datetime=c("2010-09-30 13:45:00",
"2010-09-30 13:55:00","2010-09-30 14:05:00",
"2010-09-30 14:15:00","2010-09-30 14:25:00"),
gas=c(0,1,0,4,2),stringsAsFactors=FALSE)
gas$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")
Soluzione
Usa align.time
in XTS .
library(xts)
xTemps <- align.time(xts(temps[,2],as.POSIXct(temps[,1])), n=600)
xGas <- align.time(xts(gas[,2],as.POSIXct(gas[,1])), n=600)
merge(xTemps,xGas)
Altri suggerimenti
Usa uno di zoo o XTS per contenere i dati - la loro funzione merge()
farà questo per voi. È possibile cercare le risposte precedenti qui. Il documentazione zoo ha anche un sacco di esempi rilevanti.
Ecco un esempio mock-up:
> set.seed(42)
> temps <- zoo(78+rnorm(5),
+ order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
> gas <- zoo(sample(1:5,5),
+ order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
> merge(temps,gas)
temps gas
2010-09-30 06:59:47 78.048 NA
2010-09-30 06:59:49 NA 5
2010-09-30 07:00:44 76.895 NA
2010-09-30 07:00:48 NA 1
2010-09-30 07:00:55 NA 3
2010-09-30 07:01:01 78.539 NA
2010-09-30 07:01:23 NA 2
2010-09-30 07:01:51 78.580 NA
2010-09-30 07:01:57 NA 4
2010-09-30 07:02:29 77.342 NA
> na.locf(merge(temps,gas))
temps gas
2010-09-30 06:59:49 78.048 5
2010-09-30 07:00:44 76.895 5
2010-09-30 07:00:48 76.895 1
2010-09-30 07:00:55 76.895 3
2010-09-30 07:01:01 78.539 3
2010-09-30 07:01:23 78.539 2
2010-09-30 07:01:51 78.580 2
2010-09-30 07:01:57 78.580 4
2010-09-30 07:02:29 77.342 4
>