从多年的时间序列计算每小时平均值(Calculating hourly averages from

2019-06-23 09:40发布

我拥有一个充满每小时的平均风速为多年的数据集。 我想创建一个“平年”,其中​​每一个小时为每小时超过多年平均风速计算。 我怎样才能做到这一点,而无需通过数据集不断地循环? 理想情况下,我想只是通过数据循环一次,提取每行的权月,日,时,并在数据帧从该行加上风速向右行,其中聚集了各月,日和小时聚集。 是否有可能做到这一点无需解压,月,日和小时,然后遍历整个平均年data.frame找到合适的行?

一些示例数据:

data.multipleyears <- data.frame(
 DATETIME = c("2001-01-01 01:00:00", "2001-05-03 09:00:00", "2007-01-01 01:00:00", "2008-02-29 12:00:00"),
 Windspeed = c(10, 5, 8, 3)
)

我想在这样的数据帧聚合:

average.year <- data.frame(
 DATETIME = c("01-01 00:00:00", "01-01 01:00:00", ..., "12-31 23:00:00")
 Aggregate.Windspeed = (100, 80, ...)
)

从那里,我可以去计算平均数,等等。我可能已经忽视了一些命令,但什么是这样的事情(在伪代码)正确的语法:

 for(i in 1:nrow(data.multipleyears) {
  average.year$Aggregate.Windspeed[
   where average.year$DATETIME(month, day, hour) == data.multipleyears$DATETIME[i](month, day, hour)]  <- average.year$Aggregate.Windspeed + data.multipleyears$Windspeed[i]
 }

或类似的东西。 帮助表示赞赏!

Answer 1:

我预测,ddply和plyr包将是你最好的朋友:)。 我创建了1到10毫秒之间每小时随机windspeeds 30年的数据集:

begin_date = as.POSIXlt("1990-01-01", tz = "GMT")
# 30 year dataset
dat = data.frame(dt = begin_date + (0:(24*30*365)) * (3600))
dat = within(dat, {
  speed = runif(length(dt), 1, 10)
  unique_day = strftime(dt, "%d-%m")
})
> head(dat)
                   dt unique_day    speed
1 1990-01-01 00:00:00      01-01 7.054124
2 1990-01-01 01:00:00      01-01 2.202591
3 1990-01-01 02:00:00      01-01 4.111633
4 1990-01-01 03:00:00      01-01 2.687808
5 1990-01-01 04:00:00      01-01 8.643168
6 1990-01-01 05:00:00      01-01 5.499421

要在这个30年期计算日常normalen(30年的平均水平,这个术语多气象学使用):

library(plyr)
res = ddply(dat, .(unique_day), 
            summarise, mean_speed = mean(speed), .progress = "text")
> head(res)
  unique_day mean_speed
1      01-01   5.314061
2      01-02   5.677753
3      01-03   5.395054
4      01-04   5.236488
5      01-05   5.436896
6      01-06   5.544966

这发生在我卑微的两个核心AMD只需要几秒钟,所以通过不需要数据我怀疑只是去一次。 这些多重ddply不同的聚合(月,季等)调用可以单独完成。



Answer 2:

您可以使用substr提取所需日期的部分,然后用tapplyddply汇总数据。

tapply(
  data.multipleyears$Windspeed, 
  substr( data.multipleyears$DATETIME, 6, 19), 
  mean 
)
# 01-01 01:00:00 02-29 12:00:00 05-03 09:00:00 
#              9              3              5 

library(plyr)
ddply(
  data.multipleyears, 
  .(when=substr(DATETIME, 6, 19)), 
  summarize, 
  Windspeed=mean(Windspeed)
)
#             when Windspeed
# 1 01-01 01:00:00         9
# 2 02-29 12:00:00         3
# 3 05-03 09:00:00         5


Answer 3:

这是很旧的文章,但我想补充。 我想timeAverage的OpenAir中也可以使用。 在手册中,也有timeAverage功能更多的选择。



文章来源: Calculating hourly averages from a multi-year timeseries
标签: r dataframe plyr