2017-01-12 9 views
1

Извинения, если это очевидный вопрос, но я новичок в R, проведя много лет с SASR - интерполировать временные ряды с одинаковым интервалом, но новые моменты времени

У меня есть два файла данные измерений, сделанный на 10 -секунды, но не в то же время. Я хотел бы преобразовать один из временных рядов в соответствие с временами другого, отрегулировав его значения с помощью линейной интерполяции. В SAS я мог бы сделать это довольно быстро с расширением proc, но я не могу найти ничего подобного в R (я смотрел на зоопарк и xts).

Чтобы показать, что я имею в виду, вот фрагменты моих двух файлов. В этом случае один временной ряд находится на 3-х, а второй - на 2-х. В этом конкретном случае разница в 1 секунду, вероятно, тривиальна, но это проблема, с которой я сталкиваюсь во многом в своей работе, поэтому я хотел бы знать, есть ли простой способ пересчета через линейную интерполяцию значения в второй набор данных также может быть на 3-в

Дата, время, Значение

3-Nov-16,13: 15: 53,264.651

3-ноября-16,13: 16: 03,264.58

3-Nov-16,13: 16: 13,264.368

3-Nov-16,13: 16: 23,264.273

3-ноября-16,13: 16: 33,264.391

11/3/16,1: 15: 52 вечера, 10,1

11/3/16,1: 16: 02 вечера, 10,1

11/3/16,1: 16: 12 вечера, 10,1

11/3/16,1: 16: 22 вечера, 10,1

11/3/16,1: 16 : 32 PM, 10.1

+0

Создать полиномиальную сплайн-интерполяцию и переоценить ее в новых точках времени? – smci

ответ

2

Вы можете использовать 'ок' функции. Вот пример с вашими данными:

> input <- read.table(text = "11/3/16,1:15:52 PM,10.1 
+ 
+ 11/3/16,1:16:02 PM,10.1 
+ 
+ 11/3/16,1:16:12 PM,10.1 
+ 
+ 11/3/16,1:16:22 PM,10.1 
+ 
+ 11/3/16,1:16:32 PM,10.1", as.is = TRUE, sep = ',') 
> 
> # convert the date 
> input$time <- as.POSIXct(input$V2, format = "%I:%M:%S %p") 
> library(lubridate) 
> 
> input$newtime <- input$time 
> 
> first <- read.table(text = "3-Nov-16,13:15:53,264.651 
+ 
+ 3-Nov-16,13:16:03,264.58 
+ 
+ 3-Nov-16,13:16:13,264.368 
+ 
+ 3-Nov-16,13:16:23,264.273 
+ 
+ 3-Nov-16,13:16:33,264.391", as.is = TRUE, sep = ',') 
> first$time <- as.POSIXct(first$V2, format = "%H:%M:%S") 
> 
> # use "approx" to interprete values 
> # find values for times in "input" since "first" has different values 
> input$result <- approx(first$time, 
+      first$V3, 
+      xout = input$time, 
+      rule = 2 
+      )$y 
>       
> 
> input 
     V1   V2 V3    time    newtime result 
1 11/3/16 1:15:52 PM 10.1 2017-01-11 13:15:52 2017-01-11 13:15:52 264.6510 
2 11/3/16 1:16:02 PM 10.1 2017-01-11 13:16:02 2017-01-11 13:16:02 264.5871 
3 11/3/16 1:16:12 PM 10.1 2017-01-11 13:16:12 2017-01-11 13:16:12 264.3892 
4 11/3/16 1:16:22 PM 10.1 2017-01-11 13:16:22 2017-01-11 13:16:22 264.2825 
5 11/3/16 1:16:32 PM 10.1 2017-01-11 13:16:32 2017-01-11 13:16:32 264.3792 
> first 
     V1  V2  V3    time 
1 3-Nov-16 13:15:53 264.651 2017-01-11 13:15:53 
2 3-Nov-16 13:16:03 264.580 2017-01-11 13:16:03 
3 3-Nov-16 13:16:13 264.368 2017-01-11 13:16:13 
4 3-Nov-16 13:16:23 264.273 2017-01-11 13:16:23 
5 3-Nov-16 13:16:33 264.391 2017-01-11 13:16:33 
> 
+0

Спасибо! Это именно то, что я искал – SEGilman

0

I apologi ze, что я немного ленив, пытаясь оценить ввод, как вы просили. Я все еще изучаю R. Интересно, решает ли этот фрагмент ваш основной вопрос.

Алгоритм прост

я изменить все время Unix времени, которое является количество секунд с начала эпохи.

Я использую UnixTime в качестве й и второго номера, как у

создать новые точки данных на основе второго набора DateTime как UnixTime.

toUnixTime <- function(dateobj){ 
    return (as.numeric(as.POSIXct(dateobj, origin="1970-01-01"))) 
} 

toDateTime <- function(unixtime){ 
return (as.POSIXct(unixtime, origin="1970-01-01")) 
} 
toUnix <- function(datetime){ 
return (as.numeric(strptime(datetime, "%d-%b-%y,%H:%M:%S"))) 
} 
toUnix2 <- function(datetime){ 
return (as.numeric(strptime(datetime, "%m/%d/%y,%I:%M:%S %p"))) 
} 
main <- function(){ 
x <- c(toUnix("3-Nov-16,13:15:53"),toUnix("3-Nov-16,13:16:03:53")) 
y <- c(264.651,264.58) 
f <- approxfun(x,y) 
f(toUnix2("11/3/16,1:16:02 PM")) 
} 
main() 

Это выводит

264.5871 for 11/3/16,1:16:02 PM 

 Смежные вопросы

  • Нет связанных вопросов^_^