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

问题描述:

对R来说很新,我很感谢您在这个问题上给予我的任何帮助。合并连续的15分钟时间序列数据集与不连续的15分钟时间序列数据集

我有两个我想要合并的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和B的数值变量可以用A和B不幸的是15分钟的时间可以互换绘制了一个非标准的时间使用padr的时间间隔。我已经看过堆栈溢出的例子,最近的我可以找到的是here,但无法使其工作。它将我的数据集充实到1分钟的数据间隔,但即使在15分钟的时间内,NA也取代了我所有的数字变量。错误包括诸如DateTime变量未排序的语句。

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

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) 

你可以用XTS解决这个问题,但请记住,XTS就像是一个矩阵:它可以只存储一种类型的数据。另外,除非需要访问POSIXlt对象中包含的特定元素,否则应该使用POSIXct而不是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