2013-04-15 2 views
7

У меня есть проблемы с недостающими данными, но у меня нет Nas - в противном случае было бы легче справиться ...добавить недостающую XTS/зоопарки данных с линейной интерполяцией в R

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

time, value 
2012-11-30 10:28:00, 12.9 
2012-11-30 10:29:00, 5.5 
2012-11-30 10:30:00, 5.5 
2012-11-30 10:31:00, 5.5 
2012-11-30 10:32:00, 9 
2012-11-30 10:35:00, 9 
2012-11-30 10:36:00, 14.4 
2012-11-30 10:38:00, 12.6 

Как вы можете видеть - отсутствуют некоторые минутные значения - это xts/zoo, поэтому я использую as.POSIXct ... чтобы установить дату как индекс. Как добавить отсутствующие временные метки, чтобы получить полный ts? Я хочу заполнить недостающие значения линейной интерполяцией.

Благодарим за помощь!

+0

Got один возможный ответ: http://stackoverflow.com/questions/15114834/interpolate-zoo-object-with-missing-date? rq = 1 действительно работает с зоопарком, но потом я могу вернуться в xts. Проблема с «неправильными» значениями - как фильтровать и устанавливать на NA? Спасибо! –

+0

См. Также http://stackoverflow.com/questions/11897169/change-nas-to-interpolated-flat-bars –

ответ

9

merge Ваши данные с вектором со всеми датами. После этого вы можете использовать na.approx для заполнения пробелов (в этом случае NA).

data1 <-read.table(text="time, value 
2012-11-30-10:28:00, 12.9 
2012-11-30-10:29:00, 5.5 
2012-11-30-10:30:00, 5.5 
2012-11-30-10:31:00, 5.5 
2012-11-30-10:32:00, 9 
2012-11-30-10:35:00, 9 
2012-11-30-10:36:00, 14.4 
2012-11-30-10:38:00, 12.6", header = TRUE, sep=",", as.is=TRUE) 
times.init <-as.POSIXct(strptime(data1[,1], '%Y-%m-%d-%H:%M:%S')) 
data2 <-zoo(data1[,2],times.init) 
data3 <-merge(data2, zoo(, seq(min(times.init), max(times.init), "min"))) 
data4 <-na.approx(data3) 
4

P Lapointe для прохладного ответа. Кроме того, если вы также воспользоваться «Xout» аргумент в na.approx, вам больше не нужно делать слияние:

data1 <-read.table(text="time, value 
2012-11-30-10:28:00, 12.9 
2012-11-30-10:29:00, 5.5 
        2012-11-30-10:30:00, 5.5 
        2012-11-30-10:31:00, 5.5 
        2012-11-30-10:32:00, 9 
        2012-11-30-10:35:00, 9 
        2012-11-30-10:36:00, 14.4 
        2012-11-30-10:38:00, 12.6", header = TRUE, sep=",", as.is=TRUE) 
times.init <-as.POSIXct(strptime(data1[,1], '%Y-%m-%d-%H:%M:%S')) 
data2 <-zoo(data1[,2],times.init) 
data2 
data4 <- na.approx(object=data2, 
      xout=seq(min(times.init), max(times.init), "min"))