我有一个数据框对象,看起来如下:
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-04
到2013-03-08
(无法进行硬编码,需要具有动态性,并且需要保留其间的所有NA)。
数据的频率需要每周一次,第一个值应该是数据帧中最旧的值。即在此示例中1984-01-04
。
需要将数据框对象转换为timeSeries对象。
提前致谢!
答案 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)