我目前看过imputeTS和动物园包,但它看起来不起作用 目前的数据是......
string componentName = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder oUriBuilder = new UriBuilder(componentName);
string strPath = oUriBuilder.UnescapeDataString(oUriBuilder.Path);
string strDirectory = Path.GetDirectoryName(strPath);
我想用插值时间序列填充NA,以便时间是前后行的中点。另外,我必须指出每个时间序列属于一个组。意味着时间重置每个组。
提前感谢您的帮助!
答案 0 :(得分:1)
na.approx
可以执行此操作,并且可以使用base中的tapply
或data.table中的组操作来无需循环地处理分组。
对于您的数据集
df <- read.table(text=c("
group timeseries
1 '2017-05-17 04:00:00'
1 '2017-05-17 04:01:00'
1 NA
1 NA
1 '2017-05-17 05:00:00'
1 '2017-05-17 06:00:00'
2 NA
2 '2017-05-17 04:31:00'
2 NA
2 NA
2 NA
2 '2017-05-17 05:31:00'
"),
colClasses = c("integer", "POSIXct"),
header = TRUE)
编写函数以将向量强制转换为动物园对象,插入NA,提取结果
library(zoo)
foo <- function(x) coredata(na.approx(zoo(x), na.rm = FALSE))
在基础R中使用tapply将foo应用于每个组的示例
df2 <- df #make a copy
df2$timeseries <- do.call(c, tapply(df2$timeseries, INDEX = df2$group, foo))
在data.table中使用group by将foo应用于每个组的示例
library(data.table)
DT <- data.table(df)
DT[, timeseries := foo(timeseries), by = "group"]
答案 1 :(得分:1)
imputeTS和zoo不会将字符或时间戳作为插值函数的输入。 (通常插值字符没有意义)
但是您可以将字符作为动物园的na.locf函数的输入。 (最后一次观察是用这个函数继续进行的)
您的任务的最佳解决方案应如下所示 (我假设您将日期指定为POSIX.ct)
# Perform the imputation on numeric input
temp <- imputeTS::na.interpolation( as.numeric ( input ) )
# Transform the numeric values back to dates
as.POSIXct(temp, origin = "1960-01-01", tz = "UTC")
使用&#34;输入&#34;在第一行是带有POSIX.ct时间戳的向量。 必须根据时间戳设置第二行中的原点和tz(时区)设置。