合并连续的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