如何在每小时的时间序列中添加缺少的日期并删除重复的日期。缺少日期填写相应的日期与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
答案 0 :(得分:1)
您可以结合seq.POSIXt
使用data.frame
创建一个没有丢失时间步骤(对象grid.
),然后使用merge
与观察到的{df
结合使用{1}}在我的例子中。
这应该可以解决您的问题
# 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 :(得分:1)
aggregate
中的read.zoo
参数处理重复项。在这种情况下,我们对它们进行平均,但我们可以采取其他操作,例如使用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
如果数据来自文件,请将text = Lines
替换为file = "myfile.dat"
。