插值时间序列

Ale*_*ald 15 r time-series linear-interpolation

我有一个时间序列问题,希望有人可以帮忙!

问题围绕着两组具有不同时间戳的数据.一组数据包含校准数据,另一组包含样本数据.校准比样品频繁得多.

我想要做的是将校准数据(低频率)插入采样时间序列(高频率).

sam <- textConnection("time, value
01:00:52, 256
01:03:02, 254
01:05:23, 255
01:07:42, 257
01:10:12, 256")

cal <- textConnection("time, value
01:01:02, 252.3
01:05:15, 249.8
01:10:02, 255.6")

sample <- read.csv(sam)

sample$time <- as.POSIXct(sample$time, format="%H:%M:%S")

calib <- read.csv(cal)

calib$time <- as.POSIXct(calib$time, format="%H:%M:%S")
Run Code Online (Sandbox Code Playgroud)

最大的问题(我看到)是数据的频率随机变化.

你们中的任何人都必须做类似的事吗?是否有chron或zoo功能可以实现我想要的功能(将低频率数据内插到更高的频率数据,其中两个ts都是随机的)?

Jos*_*ich 23

我会使用zoo(或xts)并像这样做:

library(zoo)
# Create zoo objects
zc <- zoo(calib$value, calib$time)    # low freq
zs <- zoo(sample$value, sample$time)  # high freq
# Merge series into one object
z <- merge(zs,zc)
# Interpolate calibration data (na.spline could also be used)
z$zc <- na.approx(z$zc, rule=2)
# Only keep index values from sample data
Z <- z[index(zs),]
Z
#                      zs       zc
# 2012-10-25 01:00:52 256 252.3000
# 2012-10-25 01:03:02 254 251.1142
# 2012-10-25 01:05:23 255 249.9617
# 2012-10-25 01:07:42 257 252.7707
# 2012-10-25 01:10:12 256 255.6000
Run Code Online (Sandbox Code Playgroud)


M--*_*M-- 7

您也可以使用这样的approx功能,它将更加容易。只要确保您正在使用数据框即可。另外,请使用来确保校准和样品数据集中的列格式相同as.POSIXct

 calib <- data.frame(calib); sample <- data.frame(sample)

 IPcal <- data.frame(approx(calib$time,calib$value, xout = sample$time, 
                 rule = 2, method = "linear", ties = mean))

 head(IPcal)

#                x        y
#1 2017-03-22 01:00:52 252.3000
#2 2017-03-22 01:03:02 251.1142
#3 2017-03-22 01:05:23 249.9617
#4 2017-03-22 01:07:42 252.7707
#5 2017-03-22 01:10:12 255.6000
Run Code Online (Sandbox Code Playgroud)

了解更多关于approxapproxfun文档