使用不连续的15分钟时间序列数据集合并连续的15分钟时间序列数据集

时间:2017-03-31 18:42:08

标签: r time-series pad

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变量之类的语句未排序。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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)