2012-07-22 57 views
1

如何添加缺失日期並刪除小時間系列中的重複日期。缺少日期填寫相應的日期與降雨量NA。如何添加缺失日期並刪除每小時時間系列中的重複日期

的例子時間序列像

   date Rainfall(mm) 
1970-01-05 00:00:00   1.0 
1970-01-05 01:00:00   1.0 
1970-01-05 05:00:00   3.6 
1970-01-05 06:00:00   3.6 
1970-01-05 07:00:00   2.2 
1970-01-05 08:00:00   2.2 
1970-01-05 09:00:00   2.2 
1970-01-05 10:00:00   2.2 
1970-01-05 11:00:00   2.2 
1970-01-05 13:00:00   2.2 
1970-01-05 13:00:00   2.2 
1970-01-05 13:00:00   2.2 

回答

1

您可以使用seq.POSIXt組合來創建,無失的時間步長(對象grid.)一data.frame,然後用merge在我的例子與觀察df結合。

這應該解決您的問題

# Create a sample data.frame missing every second observation. 
df <- data.frame(date=seq.POSIXt(from=as.POSIXct("1970-01-01 00:00:00"), to=as.POSIXct("1970-01-01 10:00:00"), by="2 hours"), rainfall=rnorm(6)) 
#Create a seq of times without anything missing 
grid. <- data.frame(date=seq.POSIXt(as.POSIXct("1970-01-01 00:00:00"), to=as.POSIXct("1970-01-01 10:00:00"), by="1 hours")) 
# Merge them together keeping all the values from grid. 
dat. <- merge(grid., df, by="date", all.x=TRUE) 

要刪除重複值,你可以找他們,並使用duplicated功能刪除它們。

# The ! means the reverse logic. Therefore TRUE becomes FALSE. 
dup_index <- !duplicated(dat.[,1]) 
# Now re-create the dat. object with only non-duplicated rows. 
dat. <- dat.[dup_index,] 

另一種方法是使用aggregate函數。如果你有兩個實際上是兩個不同的觀察結果的副本,那麼這可能很有用,因此你需要這兩個平均值;

dat. <- aggregate(dat.[,2], by=list(dat[,1]), FUN=mean) 

HTH

1

FAQ#13中的zoo FAQ vignette地址填寫左右的時間序列的部分。 read.zoo中的aggregate參數處理重複項。在這種情況下,我們對它們進行平均,但我們可以採取其他措施,例如使用FUN = function(x) tail(x, 1)。我們在這裏使用chron日期/時間來避免時區問題(請參閱R News 4/1),但如果時區相關,我們可以使用POSIXct - 由於它們不在輸入中,因此它們似乎不是。

Lines <- "date Rainfall(mm) 
1970-01-05 00:00:00   1.0 
1970-01-05 01:00:00   1.0 
1970-01-05 05:00:00   3.6 
1970-01-05 06:00:00   3.6 
1970-01-05 07:00:00   2.2 
1970-01-05 08:00:00   2.2 
1970-01-05 09:00:00   2.2 
1970-01-05 10:00:00   2.2 
1970-01-05 11:00:00   2.2 
1970-01-05 13:00:00   2.2 
1970-01-05 13:00:00   2.2 
1970-01-05 13:00:00   2.2" 

library(zoo) 
library(chron) 

asChron <- function(d, t) as.chron(paste(d, t)) 
z <- read.zoo(text = Lines, skip = 1, index = 1:2, FUN = asChron, agg = mean) 
merge(z, zoo(, seq(start(z), end(z), 1/24))) # as in FAQ 

如果數據來自一個文件的東西,如file = "myfile.dat"更換text = Lines