将时间序列数据设置3天并保存在列表中

时间:2018-11-03 06:48:39

标签: r list for-loop time-series

将时间序列设置为3天,并保存在列表中。这样,假设第一个子集来自day 1 to day 3,则第二个子集来自day 2 to day 4,这样每个子集的数据为3天。请注意,这是10分钟的数据时间戳。然后根据数据中可用数据的总天数保存列表中的每个子集。 我试图重现它。

 time_10 <- seq(ISOdatetime(2001,2,1,0,0,0), ISOdatetime(2001,3,31,0,0,0), by=(200))
var1 <- runif(length(s), min=20, max=70)
var2 <- runif(length(s), min=50, max=90)
var3 <- runif(length(s), min=50, max=90)

    a <- as.data.frame(matrix(, nrow = length(time_10), ncol = 4))
    names(a)<- c("time_10","var1","var2","var3")
    a$time_10 <- time_10
    a$var1 <- var1
    a$var2 <- var2
    a$var3 <- var3
    head(a)  

enter image description here

这是我要附加的图像,它将提供子设置时间序列数据并将其保存在列表中的想法。这里分别是D1:day1,D2:day2,D3:day3。注意使用For循环或任何其他最佳方法。注意:因此在For循环内,将连续进行3天的数据子设置,并将其保存在索引为(Subset_n)的列表中,其中n是子集编号。

2 个答案:

答案 0 :(得分:3)

这似乎适合您的情况。我要做的是提取日期并从头到尾滚动3天的窗口(ww)。对于每个步骤,我都会根据窗口中的天数对data.frame进行子集并将其存储到列表中。

time_10 <- seq(ISOdatetime(2001,2,1,0,0,0), ISOdatetime(2001,3,31,0,0,0), by=(200))
var1 <- runif(length(time_10), min=20, max=70)
var2 <- runif(length(time_10), min=50, max=90)
var3 <- runif(length(time_10), min=50, max=90)

a <- as.data.frame(matrix(, nrow = length(time_10), ncol = 4))
names(a)<- c("time_10","var1","var2","var3")
a$time_10 <- time_10
a$var1 <- var1
a$var2 <- var2
a$var3 <- var3

date <- strptime(a$time_10, format = "%Y-%m-%d")
td10 <- sort(unique(date))

ww <- 3
out <- vector("list", length(td10) - round(ww/2))  # preallocate a list

for (i in 1:length(td10)) {
  bb <- i:(i + ww - 1) # this is the bounding box

  if (max(bb) > length(td10)) {
    message("End of time series reached, exiting.")
    return(NULL)
  }

  out[[i]] <- a[date %in% td10[bb], ]
}

# check ranges of dates for each subset
lapply(out, FUN = function(x) range(x$time_10))

答案 1 :(得分:2)

我相信以下代码可以满足您的要求。它使用软件包minutes中的函数lubridate使日期/时间计算更容易。

days3 <- lubridate::days(3)
d1 <- a$time_10[1]
d2 <- a$time_10[nrow(a)] - lubridate::days(2)

res <- lapply(seq(d1, d2, by = "1 days"), function(d){
  i <- which(d <= a$time_10 & a$time_10 < d + days3)
  a[i, ]
})

编辑。
我发现res的每个数据帧中的行数很麻烦,因此很难检查上面的代码是否确实产生了预期的结果。这是一种检查方法。

check <- lapply(res, function(DF) lubridate::day(DF$time_10))
check <- sapply(check, function(x) rle(x)$values)
head(check, 3)
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 2 3 4
#
#[[3]]
#[1] 3 4 5

rm(check)    # tidy up

数据。

由于原始代码不可复制,我将重新发布数据创建代码。

set.seed(8893)

time_10 <- seq(ISOdatetime(2001,2,1,0,0,0), ISOdatetime(2001,3,31,0,0,0), by=(200))
var1 <- runif(length(time_10), min=20, max=70)
var2 <- runif(length(time_10), min=50, max=90)
var3 <- runif(length(time_10), min=50, max=90)

a <- data.frame(time_10, var1, var2, var3)
相关问题