7

我有各种产品的每日价格系列;我想转换为具有每周或每月数据的新数据框。

在此处输入图像描述

我首先使用 xts 来应用 to.weekly 函数……它仅适用于 OHLC 格式。我确信可能存在类似于 to.weekly 的函数,但对于格式不是 OHLC 的数据帧。

已经有与此相关的不同帖子如下: Rollapply() 是否允许调用函数的结果数组?将每日数据平均为每周数据

我最终使用了:

length(bra)

[1] 2416

test<-bra[seq(1,2416,7),]

会有更有效的方法吗?谢谢。

4

3 回答 3

13

让我们试试这个数据:

library(zoo)
tt <- seq(Sys.Date(), by='day', length=365)
vals <- data.frame(A=runif(365), B=rnorm(365), C=1:365)
z <- zoo(vals, tt)

现在我定义了一个提取年份和周数的函数(%Y如果不需要区分年份,则删除):

week <- function(x)format(x, '%Y.%W')

您可以使用此函数来聚合zoo具有平均值的对象(例如):

aggregate(z, by=week, FUN=mean)

产生这个结果:

                A           B  C
2013.18 0.3455357  0.34129269  3
2013.19 0.4506297  0.57665133  9
2013.20 0.3950585  0.46197173 16
2013.21 0.5990886 -0.02689994 23
2013.22 0.5115043  0.18726564 30
2013.23 0.5327597  0.16250339 37
于 2013-05-08T17:00:48.893 回答
7

我对 R 相当陌生,但是当我遇到类似问题时偶然发现了这一点。我需要转换不是 OHLC 的 xts 数据。to.monthly 声明它可以处理单变量序列,但它也详细说明它只支持返回 OHLC。我认为只需设置 OHLC=FALSE 即可。或者, to.period 的来源使用以下功能,它甚至可以转换多个系列(都具有相同的时间索引)

data.monthly <- data[ endpoints(data, on="months", k=1), ]

简短而干净,甚至复制列名。

于 2014-11-12T10:20:14.793 回答
0

使用tidyquant可以帮助您实现这一点,而无需将 series 转换为zooor xts

library(tidyquant)

library(zoo)

tt <- seq(Sys.Date(), by='day', length=365)  
vals <- data.frame(A=runif(365), B=rnorm(365), C=1:365)
z <- data.frame(vals, tt)

现在,使用tidyquant

z <- z  %>% tq_transmute(mutate_fun = apply.monthly, FUN = mean, na.rm = TRUE)
于 2021-08-21T14:52:33.653 回答