R - 将时间序列插入到相同的时间间隔但新的时间点

R - interpolate time series to same interval but new time points

抱歉,如果这是一个明显的问题,但我是 R 的新手,在 SAS 上工作了很多年

我有两个以 10 秒为间隔进行测量的数据文件,但不是在完全相同的时间点。我想转换一个时间序列以匹配另一个时间序列,用线性插值调整它的值。在 SAS 中,我可以使用 proc expand 快速完成此操作,但我在 R 中找不到任何类似的包(我看过 zoo 和 xts)。

为了说明我的意思,这里是我的两个文件的片段。在这种情况下,一个时间序列在 3 上,另一个在 2 上。在这种特殊情况下,1 秒的差异可能微不足道,但这是我 运行 在工作中经常遇到的一个问题,所以我想知道是否有任何简单的方法可以通过线性插值重新计算,第二个数据集中的值也在 3 的

日期、时间、值

16 年 11 月 3 日,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

16 年 11 月 3 日,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,10.1

很抱歉,我有点懒惰地尝试按照您的要求评估输入。我还在学习R,不知道这段代码能不能解决你的根本问题

算法简单

我将所有时间更改为 Unix 时间,即自纪元以来的秒数。

我使用 unixtime 作为 x,第二个数字作为 y

我根据第二组日期时间创建新的数据点作为 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

您可以使用'approx'功能。以下是您的数据示例:

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