【问题标题】:Merge continuous 15-min time series dataset with discontinuous 15-min time series dataset将连续的 15 分钟时间序列数据集与不连续的 15 分钟时间序列数据集合并
【发布时间】:2017-08-26 03:11:11
【问题描述】:

R 新手,感谢您在此问题上提供的任何帮助。

我有两个要合并的 15 分钟时间序列数据集。然后我想在一个共同的 x 轴上绘制来自这个合并数据集的变量组合。这是一个问题,其中一个数据集缺少值/日期。我们将数据集称为 A 和 B。

A 有一个格式为 posixlt 的日期时间列和 14 个数字变量(与水质相关)。读数间隔为 15 分钟。然而,时间序列是不完整的,一些读数,由于设备错误丢失。 B 还有一个 15 分钟间隔的日期时间列,格式为 posixlt 和 1 个数字变量。然而,这个系列是连续的,即没有缺失数据。

这是一个简短的例子,但数据涵盖了大约 6 个月,这个问题在整个过程中随机重复(注意数据 A 缺少 2:45 的读数):

Temp Turb            DATETIME                 Q            DATETIME       
1   21    5 2017-03-19 02:00:00             1 3 2017-03-19 02:00:00 
2   15    5 2017-03-19 02:15:00             2 3 2017-03-19 02:15:00
3   18    5 2017-03-19 02:30:00             3 3 2017-03-19 02:30:00
4   17   17 2017-03-19 03:00:00             4 5 2017-03-19 02:45:00
5   18    5 2017-03-19 03:15:00             5 7 2017-03-19 03:00:00
6   17    5 2017-03-19 03:30:00             6 6 2017-03-19 03:15:00
7   17    6 2017-03-19 03:45:00             7 4 2017-03-19 03:30:00    
                                            8 3 2017-03-19 03:45:00

这是缩短示例的代码。

A<- data.frame("DATE" =c("3/19/17","3/19/17","3/19/17","3/19/17",
                        "3/19/17","3/19/17","3/19/17"), "TIME"=c("02:00:00","02:15:00",
                         "02:30:00","03:00:00","03:15:00","03:30:00","03:45:00"),
                        "Temp" = c(21,15,18,17,18,17,17), "Turb" = c(5,5,5,17,5,5,6)) 
                          A$DATETIME <-paste(A$DATE,A$TIME)
                         A$DATETIME <- strptime(A$DATETIME, "%m/%d/%y %H:%M:%S")
                         A<-subset( A, select = -c(DATE,TIME) )
B <- data.frame("DATE" =c("3/19/17","3/19/17","3/19/17","3/19/17",
                        "3/19/17","3/19/17","3/19/17","3/19/17"), "TIME"=c("02:00:00","02:15:00",
                         "02:30:00","02:45:00","03:00:00","03:15:00","03:30:00","03:45:00"),
                         "Q" = c(3,3,3,5,7,6,4,3)) 
                          B$DATETIME <-paste(B$DATE,B$TIME)
                          B$DATETIME <- strptime(B$DATETIME, "%m/%d/%y %H:%M:%S")
                         B<-subset( B, select = -c(DATE,TIME) )

我希望使用 padr 用空白填充 A 中的缺失数据,以便 A 和 B 的数值变量可以与 A 和 B 的时间互换。不幸的是,15 分钟是使用 padr 的非标准时间间隔.我查看了堆栈溢出的示例,我能找到的最接近的是here,但无法使其工作。它将我的数据集充实到 1 分钟的数据间隔,但即使在 15 分钟的标记处,NA 也替换了我的所有数字变量。错误包括诸如 DateTime 变量未排序之类的语句。

有关链接示例的任何其他建议或更具体的指导?谢谢!!!

【问题讨论】:

    标签: r time-series pad


    【解决方案1】:

    您可以使用 xts 解决这个问题,但请记住,xts 就像一个矩阵:它只能存储一种类型的数据。此外,您应该使用POSIXct 而不是POSIXlt,除非您需要访问包含在POSIXlt 对象中的特定元素。

    require(xts)
    a <- xts(A[,c("Temp","Turb")], as.POSIXct(A$DATETIME))
    b <- xts(B["Q"], as.POSIXct(B$DATETIME))
    (x <- merge(a, b))
    #                     Temp Turb Q
    # 2017-03-19 02:00:00   21    5 3
    # 2017-03-19 02:15:00   15    5 3
    # 2017-03-19 02:30:00   18    5 3
    # 2017-03-19 02:45:00   NA   NA 5
    # 2017-03-19 03:00:00   17   17 7
    # 2017-03-19 03:15:00   18    5 6
    # 2017-03-19 03:30:00   17    5 4
    # 2017-03-19 03:45:00   17    6 3
    

    如果需要,可以将结果转换回 data.frame:

    d <- data.frame(DATETIME=index(x), x)
    # remove the rownames, if you want
    rownames(d) <- NULL
    print(d)
    #              DATETIME Temp Turb Q
    # 1 2017-03-19 02:00:00   21    5 3
    # 2 2017-03-19 02:15:00   15    5 3
    # 3 2017-03-19 02:30:00   18    5 3
    # 4 2017-03-19 02:45:00   NA   NA 5
    # 5 2017-03-19 03:00:00   17   17 7
    # 6 2017-03-19 03:15:00   18    5 6
    # 7 2017-03-19 03:30:00   17    5 4
    # 8 2017-03-19 03:45:00   17    6 3
    

    【讨论】:

      【解决方案2】:

      full_join 是否为您提供所需的输出?在下面的代码中,我们需要将DATETIME 转换为POSIXct 格式,但如果需要,您可以在之后转换回来。

      library(dplyr)
      
      A$DATETIME = as.POSIXct(A$DATETIME)
      B$DATETIME = as.POSIXct(B$DATETIME)
      
      AB = full_join(A, B, by="DATETIME")  # a dplyr function
      
        Temp Turb            DATETIME Q
      1   21    5 2017-03-19 02:00:00 3
      2   15    5 2017-03-19 02:15:00 3
      3   18    5 2017-03-19 02:30:00 3
      4   17   17 2017-03-19 03:00:00 7
      5   18    5 2017-03-19 03:15:00 6
      6   17    5 2017-03-19 03:30:00 4
      7   17    6 2017-03-19 03:45:00 3
      8   NA   NA 2017-03-19 02:45:00 5
      

      使用基础 R,等价于:

      AB = merge(A,B, by="DATETIME", all=TRUE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-18
        • 2021-01-06
        • 2013-01-23
        • 2016-11-08
        • 1970-01-01
        • 2022-11-13
        • 2015-02-26
        • 1970-01-01
        相关资源
        最近更新 更多