2

我得到了一个看起来如下的数据框对象:

Date        dax_data.csv    nikkei_data.csv spx_data.csv
2013-03-15  NA              NA              1560.70
2013-03-14  NA              NA              1563.23
2013-03-13  NA              NA              1554.52
2013-03-12  NA              NA              1552.48
2013-03-11  NA              NA              1556.22
2013-03-08  8020.36         12283.62        1551.18

...

1984-01-04  4533.21         9927.00         900.42
1984-01-05  NA              9947.00         NA
1984-01-06  NA              9961.00         NA

我想做以下步骤:

  • 减少数据框以仅覆盖所有数据集都有值的日期范围。在这个例子中,从1984-01-042013-03-08(不能硬编码,需要是动态的,并且需要保留其间的所有 NA)。

  • 数据的频率需要每周一次,第一个值应该是数据框中最旧的值。即在这个例子1984-01-04中。

  • 数据框对象需要转换为 timeSeries 对象。

提前致谢!

4

2 回答 2

3

您没有解释如何将您的数据减少到每周频率。我的意思是你从一周中得到任何价值吗?还是您取平均值?...

这里有一个使用xtspackage 的选项,方便这种操作,特别是针对金融时间序列。

library(xts)
dat.ts <- xts(dat[,-1],as.POSIXct(dat$Date))
dat.ts[endpoints(dat.ts,'weeks')]

           dax_data.csv nikkei_data.csv spx_data.csv
1984-01-06           NA            9961           NA
2013-03-11           NA              NA      1556.22
2013-03-15           NA              NA      1560.70
于 2013-03-16T11:29:58.643 回答
1

我们使用 读取数据,read.zoo并使用 修剪开头和结尾的所有 NA 行na.trim。(注意,read.zoo也可以“读取”数据帧和文件。)

然后我们聚合所有具有相同值的行nextfri(在动物园快速参考小插图中定义)。 nextfri接受一个日期向量,并为每个组件返回下一个星期五(如果已经是星期五,则返回相同的日期)。实际的聚合函数是tail1(每周的最后一行),但我们可以替换任何其他合理的聚合函数,例如mean. (见?aggregate.zoo)。

最后,我们将"zoo"时间序列转换为"timeSeries"时间序列。根据您接下来打算做什么,您可能不需要这最后一步。

Lines <- "
Date        dax_data.csv    nikkei_data.csv spx_data.csv
2013-03-15  NA              NA              1560.70
2013-03-14  NA              NA              1563.23
2013-03-13  NA              NA              1554.52
2013-03-12  NA              NA              1552.48
2013-03-11  NA              NA              1556.22
2013-03-08  8020.36         12283.62        1551.18
1984-01-04  4533.21         9927.00         900.42
1984-01-05  NA              9947.00         NA
1984-01-06  NA              9961.00         NA
"

library(zoo)

z.raw <- read.zoo(text = Lines, header = TRUE)
z <- na.trim(z, is.na = "all")

nextfri <- function(x) 7 * ceiling(as.numeric(x-5+4) / 7) + as.Date(5-4)
tail1 <- function(x) tail(x, 1)
z.wk <- aggregate(z, nextfri, tail1)

library(timeSeries)
as.timeSeries(z.wk)
于 2013-03-16T12:43:13.917 回答