2

如何在每小时时间序列中添加缺失的日期和删除重复的日期。缺失的日期用 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
4

2 回答 2

1

您可以使用组合seq.POSIXt来创建一个data.frame没有丢失时间步长的对象(对象grid.),然后在我的示例中使用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)

高温高压

于 2012-07-22T11:03:08.873 回答
1

动物园常见问题解答小插图中的常见问题解答 #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 = Linesfile = "myfile.dat".

于 2012-07-22T14:05:48.167 回答