【问题标题】:Why is there no apply.hourly in R with xts/zoo?为什么使用 xts/zoo 在 R 中没有 apply.hourly?
【发布时间】:2013-04-07 19:17:42
【问题描述】:

我想按小时平均值汇总数据。日常很简单:

apply.daily(X2,mean)

为什么没有每小时的功能? 我试过了

hr.means <- aggregate(X2, format(X2["timestamp"],"%Y-%m-%d %H"))

并且在使用 trim 参数时总是出错。 有没有类似apply.daily的更简单的功能?如果我想汇总 5 分钟的平均值怎么办。 数据是每分钟的值:

"timestamp", value 
"2012-04-09 05:03:00",2
"2012-04-09 05:04:00",4
"2012-04-09 05:05:00",5
"2012-04-09 05:06:00",0
"2012-04-09 05:07:00",0
"2012-04-09 05:08:00",3
"2012-04-09 05:09:00",0
"2012-04-09 05:10:00",1

我正在使用 xts 和 zoo。

【问题讨论】:

  • 在我看来,添加例如apply.hourly 和 apply.minutely 到包!

标签: r time-series xts zoo


【解决方案1】:

试试

period.apply(X2, endpoints(X2, "hours"), mean)

apply.daily 只是上面的一个包装器:

> apply.daily
function (x, FUN, ...)
{
    ep <- endpoints(x, "days")
    period.apply(x, ep, FUN, ...)
}

【讨论】:

  • 谢谢你,5分钟的周期有什么建议吗?
  • 我得到:05:04:00 - 4; 05:09:00 - 5,... 但也许可以将第一个值设置为 05:00:00 并继续 05:05:00 可能会更容易,如果我稍后合并文件以具有相同的开始和时间步长。谢谢
  • 我明白了。您可以随意摆弄endpoints 的输出,或者只查看endpoints 打印出来的内容(它只是一个索引列表),然后用您喜欢的任何点构建一个类似的列表。
【解决方案2】:
hr.means <- aggregate(X2, format(time(X2),"%y-%m-%d %H"), mean) 

这应该可以正常工作。

【讨论】:

    【解决方案3】:

    回答第 2 部分:

    如果我想汇总 5 分钟的平均值怎么办?

    正如@eddit 在上面的评论中已经提到的那样:

    df <- read.table(header=TRUE, sep=",", stringsAsFactors=FALSE, text="
    timestamp, value 
    2012-04-09 05:03:00,2
    2012-04-09 05:04:00,4
    2012-04-09 05:05:00,5
    2012-04-09 05:06:00,0
    2012-04-09 05:07:00,0
    2012-04-09 05:08:00,3
    2012-04-09 05:09:00,0
    2012-04-09 05:10:00,1")
    X2 <- xts(df$value, as.POSIXct(df$timestamp))
    
    X2.5min <- period.apply(X2, endpoints(X2, "minutes", 5), mean)
    

    我得到:05:04:00 - 4; 05:09:00 - 5,... 但也许可以将第一个值设置为 05:00:00 并继续 05:05:00 可能会更容易,如果我稍后合并文件以具有相同的开始和时间步长。

    确实:

    > X2.5min
                        [,1]
    2012-04-09 05:04:00  3.0
    2012-04-09 05:09:00  1.6
    2012-04-09 05:10:00  1.0
    

    Darren Cook over at Cross Validated 遇到了同样的问题并写了函数align.time.down

    align.time.down=function(x,n){index(x)=index(x)-n;align.time(x,n)}
    

    这可以用来调低时间:

    X2.5mindown <- align.time.down(X2.5min, 5 * 60)
    X2.5mindown
                        [,1]
    2012-04-09 05:00:00  3.0
    2012-04-09 05:05:00  1.6
    2012-04-09 05:10:00  1.0
    

    【讨论】:

    • 正如我对 Darren 的评论,将观察结果与发生的时间之前对齐似乎是个坏主意,特别是如果您要合并与另一个时间序列聚合。
    猜你喜欢
    • 2013-04-07
    • 1970-01-01
    • 2021-11-12
    • 2015-05-29
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2013-04-07
    相关资源
    最近更新 更多