使用零值填充时间数据的间隙

时间:2017-04-18 08:47:37

标签: r

在我的数据https://pastebin.com/CernhBCg中,我有不规则的时间戳和相应的value。除了不规则之外,我还有很大的差距,对我来说,我的数据没有任何价值。但我知道,对于那些差距value为零,我想填补value=0行的间隙。我怎么能这样做?

数据

> dput(head(hub2_select,10))
structure(list(time = structure(c(1492033212.648, 1492033212.659, 
1492033212.68, 1492033212.691, 1492033212.702, 1492033212.724, 
1492033212.735, 1492033212.757, 1492033212.768, 1492033212.779
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), value = c(3, 
28, 246, 297, 704, 798, 1439, 1606, 1583, 1572)), .Names = c("time", 
"value"), row.names = c(NA, 10L), class = "data.frame")

请带上我提供的文件查看数据并用

将其读入R中
library(readr)
df <- read_csv("data.csv", col_types = list(time = col_datetime(), value = col_double()))

解决方案

对于一个,间隙的左右两侧的值通常为0或1.这可能会有所帮助。我以为我会使用滚动连接,但从现在开始我理解,这似乎不是可行的方法。

什么有效

library(dplyr)
library(lubridate)
threshold_time = dseconds(2)
time_prev = df$time[1]
addrows = data.frame()
for (i in seq(2, nrow(df),1)){
  time_current <- df$time[i]
  if ((time_current - time_prev) > threshold_time){
    time_add <- seq(time_prev, time_current, dseconds(0.1))
    addrows = bind_rows(addrows, data.frame(time=time_add, value=rep(0, length(time_add))))
  }
  time_prev <- time_current
}

addrows$type <- 'filled'
df$type <- 'orig'
df_new <- bind_rows(df, addrows)

library(ggplot2)
ggplot(df_new, aes(time,value,color=type)) + geom_point()

但是这个解决方案既不优雅也不高效(虽然我没有测试效率)。

1 个答案:

答案 0 :(得分:0)

老实说,我还没有尝试过(由于其他原因我不得不切换到Python并在那里解决它并且没有试过它),但我很确定{{3}本来应该是答案。我只想在这里为其他读者写这个问题。