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
>
抱歉,如果这是一个明显的问题,但我是 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
>