R:将每季度数据汇总为每小时数据 - 具有相同日期字段的不同行为

时间:2014-11-24 19:02:00

标签: r date aggregate average mean

我试图理解为什么R与“聚合”函数的行为不同。我想平均15m数据到小时数据。为此,我将15m数据与预先设计的“小时”数组(每小时相同日期的4倍,将原始POSIXct数组)一起传递给聚合函数。

过了一段时间,我意识到这个函数表现得很奇怪(好吧,可能数据很奇怪,但为什么?)当用

给出日期数组时
strftime(data.15min$posix, format="%Y-%m-%d %H")

但是,如果我用

移交数据
cut(data.15min$posix, "1 hour")

数据已正确平均。

下面,嵌入了一个最小的例子,包括数据样本。 我很乐意理解我做错了什么。

提前致谢!

d <- 3
bla <- read.table("test_daten.dat",header=TRUE,sep=",")
data.15min <- NULL
data.15min$posix <- as.POSIXct(bla$dates,tz="UTC")
data.15min$o3 <- bla$o3

hourtimes <- unique(as.POSIXct(paste(strftime(data.15min$posix, format="%Y-%m-%d %H"),":00:00",sep=""),tz="Universal"))

agg.mean <- function (xx, yy, rm.na = T) 
# xx: parameter that determines the aggregation: list(xx), e.g. hour etc.
# yy: parameter that will be aggregated
{
    aa <- yy
    out.mean <- aggregate(aa, list(xx), FUN = mean, na.rm=rm.na)
    out.mean  <- out.mean[,2]
}

#############
data.o3.hour.mean <- round(agg.mean(strftime(data.15min$posix, format="%m/%d/%y %H"), data.15min$o3), d); data.o3.hour.mean[1:100]

win.graph(10,5)
par(mar=c(5,15,4,2), new =T)
plot(data.15min$posix,data.15min$o3,col=3,type="l",ylim=c(10,60)) # original data
par(mar=c(5,15,4,2), new =T)
plot(data.date.hour_mean,data.o3.hour.mean,col=5,type="l",ylim=c(10,60)) # Wrong 

##############
data.o3.hour.mean <- round(agg.mean(cut(data.15min$posix, "1 hour"), data.15min$o3), d); data.o3.hour.mean[1:100]

win.graph(10,5)
par(mar=c(5,15,4,2), new =T)
plot(data.15min$posix,data.15min$o3,col=3,type="l",ylim=c(10,60)) # original data
par(mar=c(5,15,4,2), new =T)
plot(data.date.hour_mean,data.o3.hour.mean,col=5,type="l",ylim=c(10,60)) # Correct

数据:

Download data

1 个答案:

答案 0 :(得分:1)

评论太长了。

您的结果看起来不同的原因是aggregate(...)按分组变量对结果进行排序。在第一种情况下,

strftime(data.15min$posix, format="%m/%d/%y %H")

是日期格式不正确的字符向量(它们没有正确排序)。所以第一行对应于&#34; date&#34; "01/01/96 00"

在你的第二个案例中,

cut(data.15min$posix, "1 hour")

生成实际的POSIXct日期,这些日期可以正确排序。所以第一行对应日期:1995-11-04 13:00:00

如果您使用过

strftime(data.15min$posix, format="%Y-%m-%d %H")

在第一种情况下,您将获得与使用cut(...)

相同的结果