【问题标题】:How Can I Automatically Separate Time Series Data Based on Set Interval and Summarize Each Subset?如何根据集合间隔自动分离时间序列数据并汇总每个子集?
【发布时间】:2015-01-15 00:50:22
【问题描述】:

我正在寻找一种方法来获取时间与降雨深度的原始两分钟间隔数据文件,其中许多是“零”值:

 Date.time <- c("9/26/2014 15:15", 
"9/26/2014 15:12", 
"9/26/2014 15:14", 
"9/26/2014 15:16", 
"9/26/2014 15:18",
"9/26/2014 15:20",
"9/26/2014 15:22",
"9/26/2014 15:24",
"9/26/2014 15:26",
"9/26/2014 15:34",
"9/26/2014 15:36",
"9/26/2014 15:38",
"9/26/2014 15:40",
"9/26/2014 15:42",
"9/26/2014 15:44",
"9/26/2014 15:46")

Rain <- c(0,.05,.1,.03,0,0,.2,0,0,0,0,0,.04,.1,.15,.22)
my.df <- data.frame(Date.time, Rain)

有谁知道我如何根据前面有多少个零值将“雨”列分为不同的类别?我想标记或提取每组数据,这些数据由预定义的分钟数或零值分隔,没有任何数据。例如,如果我说相隔 10 分钟或更长时间的非零值将被视为两个单独的子集,那么我想将它们标记为这样,或者根据该标准提取每个子集的摘要数据。在这种情况下,0.05、.1、.03 和 .2 值将集中在一起,因为 0.03 和 0.2 值仅相隔 4 分钟,而不是 10 分钟,因此我的任意分类不会离散地分开。下一组非零值(0.04、0.1、0.15 和 0.22)与 0.2 值相隔十分钟,从而满足任意分类阈值。有人知道我可以从哪里开始吗?

编辑:我最好删除零值,这并不难:

 my.df2 <- subset(my.df, Rain>0)

然后,用my.df2,我想找出数据在10分钟内的时间,并将Rain数据累积归类为一个“事件”。概念输出可能如下所示:

     Date.time     Rain     Event
9/26/2014 15:12     0.05     A
9/26/2014 15:14     0.10     A
9/26/2014 15:16     0.03     A
9/26/2014 15:22     0.20     A
9/26/2014 15:40     0.04     B
9/26/2014 15:42     0.10     B
9/26/2014 15:44     0.15     B
9/26/2014 15:46     0.22     B

非常感谢。

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    如果至少 k 个零将它与前一组分开,则这将形成一个新组。我们使用所需的默认参数定义一个na.locf 包装器,然后在下一行中使用它来计算grpgrp 第一组为 1,下一组为 2,依此类推。对于不属于某个组的职位,它是 NA。这一切的关键是na.locf 中的maxgap 参数:

    library(zoo)
    
    k <- 3
    
    Rain <- my.df$Rain
    Rain[Rain == 0] <- NA
    nalocf <- function(x) na.locf(x, maxgap = k, na.rm = FALSE)
    
    grp <- cumsum(diff(!is.na(c(NA, nalocf(Rain)))) > 0) + nalocf(0 * Rain)
    na.omit(cbind(my.df, grp))
    

    这种情况下的结果是:

             Date.time Rain grp
    2  9/26/2014 15:12 0.05   1
    3  9/26/2014 15:14 0.10   1
    4  9/26/2014 15:16 0.03   1
    7  9/26/2014 15:22 0.20   1
    13 9/26/2014 15:40 0.04   2
    14 9/26/2014 15:42 0.10   2
    15 9/26/2014 15:44 0.15   2
    16 9/26/2014 15:46 0.22   2
    

    更新更正。

    【讨论】:

    • 绝对精彩。非常感谢您的帮助。
    • 有没有办法完成相同的分组,但在逻辑中使用 Date.time 值本身?如,从日期/时间 (i) 中减去日期/时间 (i+1) 并找出在非零值之间经过了某个时间?
    • 我不清楚零和非零应该如何影响这一点,但tt &lt;- as.POSIXct(my.df$Date.time, format = "%m/%d/%Y %H:%M"); cumsum(c(TRUE, diff(tt) &gt; 5)) 从 1 开始,每次超过前一个时间超过 5 秒时增加 1 .
    猜你喜欢
    • 2020-08-03
    • 2015-06-03
    • 2021-12-07
    • 2021-03-25
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多