2010-11-09 3 views
4

Это проблема, которая возникает часто, когда я импортирую необработанные данные из регистраторов данных. Температурный регистратор настроен на запись температуры каждые десять минут, а отдельный газовый регистратор установлен для записи газа, используемого в течение последнего десятиминутного интервала. Я хочу объединить данные из этих двух регистраторов в единый кадр данных для построения и анализа, но времена не точно выровнены. Я хочу иметь одну строку в кадре данных для каждого десятиминутного периода, с датой, показывающей начало периода времени.Как я могу сопоставить данные с временными интервалами?

данные регистратор температуры выглядит следующим образом:

  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 

Данные газа регистратор выглядит следующим образом:

  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 

Я хочу, чтобы объединить два кадра данных на десять минутные интервалы, так что комбинированные данные выглядят так:

  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 

Вот код, чтобы получить эти два кадра данных:

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

ответ

5

Использование 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) 
2

Используйте либо один из zoo или xts для хранения ваших данных - их merge() функция сделает это для вас. Здесь вы можете посмотреть предыдущие ответы. Документация zoo также содержит множество соответствующих примеров.

Вот макет пример:

> 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

Благодарим за ссылку на зоопарк. – Seth