【问题标题】:Aggregating 10 minute data to hourly mean with the hourly.apply function fails使用 hourly.apply 函数将 10 分钟数据聚合为每小时平均值失败
【发布时间】:2014-08-17 06:41:18
【问题描述】:

我有一个包含日期/时间数据及其在所述日期和时间的测量值的文件。在一个月的过程中,每十分钟测量一次这些值,我最终试图进行时间序列分析。然而,在此之前,我想通过计算每 60 分钟的平均测量值来将 10 分钟间隔聚合为每小时间隔。这是我的数据样本(共 4319 次观察):

Date/Time                 Value

2013-01-01 00:00:00     31,439999   
2013-01-01 00:10:00     33,439999   
2013-01-01 00:20:00     39         
2013-01-01 00:30:00     35,279999   
2013-01-01 00:40:00     37,279999   
2013-01-01 00:50:00     32,199997   
2013-01-01 01:00:00     35,279999   
2013-01-01 01:10:00     38,199997

我的日期/时间数据属于 POSIXlt 类型,测量的值属于类型因子。 我在这个网站上进行了搜索,发现了其他用户发布的几个主题,但它们并不都适用于我,或者我无法使用他们帖子中给出的建议重新创建相同的结果。

例如,另一个用户问了和我几乎完全相同的问题:Aggregate values of 15 minute steps to values of hourly steps 我完全按照他们的答案提供的步骤进行操作。

library(xts)
dat.xts <- xts(data$values,
           as.POSIXct(data$datetime))
hourly.apply(dat.xts,mean)

但对于最后一行,我收到以下错误消息:

Error: could not find function "hourly.apply"

虽然我已经安装了 xts 包以及 zoo 包,但 hourly.apply 函数似乎源于该包。这可能是什么原因? 提前谢谢你。

【问题讨论】:

  • 您好 AC11,我使用 ?RSiteSearch 找不到“hourly.apply”。你试过period.apply吗?

标签: r statistics time-series aggregation xts


【解决方案1】:

“hourly.apply”似乎不存在,但查看 xts 包中的“apply.daily”函数似乎很容易创建。

参见 xts::apply.daily。我已将“天”更改为“小时”以生成以下内容

apply.hourly <- function(x, FUN,...) {
  ep <- endpoints(x, 'hours')
  period.apply(x, ep, FUN, ...)
}

试试看

my.time <- seq(from = as.POSIXct('2000-01-01 00:00:00'),
           to = as.POSIXct('2000-01-01 2:00:00'),
           by = '10 min')

my.data <- rep(10, length = length(my.time))
my.data <- as.xts(my.data, order.by = my.time)

apply.hourly(my.data, sum)

                [,1]
2000-01-01 00:50:00   60
2000-01-01 01:50:00   60
2000-01-01 02:00:00   10

【讨论】:

  • 我尝试过使用您的自定义 apply.hourly,但它似乎每天都适用...几天前它正在工作并每小时应用一次,但现在我正在尝试创建可重复的流程,它是每天去。 ://
  • 您是否将该函数应用于具有次小时分量的时间值?
【解决方案2】:
sales1512<-read.csv(file.choose())
head(sales1512)
             sdate hsales
1 2011-01-06 01:00      0
2 2011-01-06 02:00      0
3 2011-01-06 03:00      0
4 2011-01-06 04:00      0
5 2011-01-06 05:00      0
6 2011-01-06 06:00      0

library(xts)
dat.xts <- xts(sales1512$hsales,as.POSIXct(sales1512$sdate))
head(dat.xts)
                    [,1]
2011-01-06 00:00:00    0
2011-01-06 01:00:00    0
2011-01-06 02:00:00    0
2011-01-06 03:00:00    0
2011-01-06 04:00:00    0
2011-01-06 05:00:00    0

ep<-endpoints(dat.xts, on="hours", k=4)  #on=”how your data is spaced”,k=how you want to club it
dat.xts.4hourly<-period.apply(dat.xts, FUN=sum,INDEX=ep)
head(dat.xts.4hourly)
                    [,1]
2011-01-06 01:00:00    0
2011-01-06 05:00:00    0
2011-01-06 09:00:00   14
2011-01-06 13:00:00  112
2011-01-06 17:00:00  112
2011-01-06 21:00:00   42

tail(dat.xts.4hourly)
                     [,1]
2013-10-04 05:00:00 275.8
2013-10-04 09:00:00 551.6
2013-10-04 13:00:00 551.6
2013-10-04 17:00:00 551.6
2013-10-04 21:00:00 551.6
2013-10-04 23:00:00 275.8

nrow(dat.xts.4hourly)    
[1] 5523

【讨论】:

  • 您好,我无法以正确的格式发布答案。但是,我认为这种方法可以解决您的问题。
  • 我修复了格式(通过选择代码并单击 {} 按钮),但 OP 要求提供 mean,而不是 sum
  • 在这种情况下,只需将总和更改为代码中的平均值(Fun=mean),代码仍然可以正常工作。
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多