将不规则时间序列转换为常规时间步长序列,其中NA为缺失​​日期

时间:2015-11-09 03:15:38

标签: r loops time-series xts zoo

我有动物追踪的一些数据,我想转换它们以便使用模型。 发射器每小时发送一次该位置,但有时我几个小时没有数据。我将使用的模型假设点在时间上是等间隔的。

我想找到一种方法从数据的第一个小时开始,然后在4小时后选择值,依此类推。 如果那时没有价值: 1)查看是否有一个(或2)小时的值或更早的值并采取它(为了避免过多的NA,见下文)。 如果还没有: 2)在所需时间包含一行,其中NA为共变量,并从那一点开始一次又一次地重新启动,直到检查了5000行。

由于我不知道动物使用的时间步数,我希望能够尝试不同的值(例如每6小时+或 - 2小时)。

以下是我的数据示例:

tab <- data.frame(Date = c("2015-04-27 02:28:00","2015-04-27 03:11:00","2015-04-27 05:16:00","2015-04-27 09:22:00","2015-04-27 10:10:00","2015-04-27 16:14:00","2015-04-27 17:29:00"),
                  ID = c("DD1","DD1","DD1","DD1","DD1","DD1","DD1"), 
                  covar= c(1,2,3,4,5,6,7))

>tab
   Date            ID    covar
2015-04-27 02:28:00 DD1     1
2015-04-27 03:11:00 DD1     2
2015-04-27 05:16:00 DD1     3
2015-04-27 09:22:00 DD1     4
2015-04-27 10:10:00 DD1     5
2015-04-27 16:14:00 DD1     6
2015-04-27 17:29:00 DD1     7

这就是我想要获得的:

>regTab4h
       Date            ID    covar
    2015-04-27 02:28:00 DD1     1      # keep this one at it is the first
                                       # Drop this one (less than 4h interval)
    2015-04-27 05:16:00 DD1     3      # Normal time would be 06 hours but 05h is in the 1h interval 
    2015-04-27 09:22:00 DD1     4      # 5 + 4 = 9 so this is perfect keep this one
                                       # No longer needed 
    2015-04-27 13:00:00 NA     NA      # Create a NA here because there is no value at the time 13:00:00 + or - 1h 
                                       # drop 16:00:00 because 13+4 = 17 and we have it
    2015-04-27 17:29:00 DD1     7

我尝试按照这篇文章中的方法进行操作:Creating regular 15-minute time-series from irregular time-series 但是当存在大的差距时,它不允许具有“NA”

为了简化数据,我将它们四舍五入到最接近的小时,并在xts对象中进行转换。

tab$Date=round.POSIXt(as.POSIXct(as.character(tab$Date)),units="hours")
x <- xts(tab[,-1],order.by =as.POSIXct((tab$Date))) 

然后我没有成功尝试:

library(hydroTSM)
x2=to.period(x,period = "hours", k=4, OHLC = FALSE)
x3=as.zoo(x2)
x4=izoo2rzoo(x3, from= start(x), to= end(x), date.fmt= "%Y-%m-%d %H:%M:%S", tstep= "hours",k=4)

任何帮助将不胜感激!

我希望我没有错过一个明显的方法来做到这一点...... 我想循环可以完成这项工作,但我不知道如何制定它。

0 个答案:

没有答案