2010-11-09 5 views
4

Il s'agit d'un problème qui survient souvent lorsque j'importe des données brutes à partir des enregistreurs de données. Un enregistreur de température est réglé pour enregistrer la température toutes les dix minutes, et un enregistreur de gaz séparé est réglé pour enregistrer le gaz utilisé dans les dix dernières minutes. Je veux combiner les données de ces deux enregistreurs dans un seul bloc de données pour le traçage et l'analyse, 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 montrant le début de la période de temps.Comment faire correspondre des trames de données par intervalles de temps?

Les données de l'enregistreur de température ressemble à:

  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 données de l'enregistreur de gaz ressemble à:

  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 dix intervalles de minutes, de sorte que les données combinées ressemblent à:

  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 

est ici 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") 

Répondre

5

Utilisation align.time dans 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) 
2

Utilisez un des zoo ou xts pour stocker vos données - leur fonction merge() fera pour vous. Vous pouvez rechercher les réponses précédentes ici. La documentation zoo contient également de nombreux 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 
> 
+0

Nous vous remercions pour le lien vers la documentation du zoo. – Seth

Questions connexes