如何在每小时的时间序列中添加缺少的日期并删除重复的日期

时间:2012-07-22 10:04:54

标签: r time-series

如何在每小时的时间序列中添加缺少的日期并删除重复的日期。缺少日期填写相应的日期与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

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)

zoo FAQ vignette中的常见问题#13解决了关于填写时间序列的部分。 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"