data.frame到timeseries对象

时间:2013-03-16 11:12:03

标签: r type-conversion dataframe time-series

我有一个数据框对象,看起来如下:

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对象。

提前致谢!

2 个答案:

答案 0 :(得分:2)

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

这是一个使用xts包的选项,方便这种操作专门针对金融时间序列。

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

答案 1 :(得分:1)

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

然后我们聚合nextfri具有相同值的所有行(在zoo Quick Reference vignette中定义)。 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)