Comment puis-je correspondre à des trames de données par intervalles de temps?
Question
Ceci est un problème qui revient souvent quand je suis l'importation de données brutes provenant des enregistreurs de données. Un enregistreur de température est réglée à la température enregistrement toutes les minutes dix et un enregistreur de gaz séparé est réglé au gaz utilisé dans le dossier dernier intervalle de dix minutes. Je veux combiner les données de ces deux enregistreurs en une seule trame de données pour l'analyse et le traçage, mais les temps ne sont pas exactement alignés. Je veux avoir une ligne dans la trame de données pour chaque période de dix minutes, avec le datetime indiquant le début de la période de temps.
Les regards de données de l'enregistreur de température comme:
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
Les regards de données de l'enregistreur de gaz comme:
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
Je veux combiner les deux trames de données sur des intervalles de dix minutes, de sorte que les regards de données combinées comme:
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
Voici un code pour obtenir ces deux trames de données:
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")
La solution
Utilisez align.time
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)
Autres conseils
Utilisez un des zoo ou XTS pour stocker vos données - leur fonction merge()
fera pour vous. Vous pouvez chercher des réponses précédentes ici. La documentation zoo a aussi beaucoup d'exemples pertinents.
Voici un exemple maquette:
> 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
>