2017-03-31 95 views
0

對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變量未排序的語句。

有關鏈接示例的其他建議或更具體的指導?謝謝!!!

回答

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) 
1

你可以用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 
相關問題