将因子类上的yyyymm转换为与ChartSeries()

时间:2017-03-06 01:17:27

标签: r csv xts quantmod

我使用read.csv()命令读取了一个CSV文件,我想用chartSeries()转换为xts和图形。

通过执行以下操作变为矩阵:

MyData <- as.matrix(MyData)

当我使用

转换为xts时
MyData_xts <- xts(MyData[,-1], order.by=as.POSIXct(MyData[,1]))

我收到以下错误消息:

Error in as.POSIXlt.character(as.character(x), ...) : 
  character string is not in a standard unambiguous format

具有我的索引的列是yyyymm格式。我已经读到这可能是一个问题,但我无法找到解决方法。

编辑1

转换为矩阵之前的CSV读取如下所示。所有行都是因子类:

 X     |Mkt.RF|SMB
 ------|------|---
 196307|-0.39 |-.046
 196308|5.07  |-0.81
 196308|-1.57 |-.048

2 个答案:

答案 0 :(得分:3)

您应该使用read.zoo将CSV直接导入到zoo对象中。如果需要,可以使用as.xts将zoo对象转换为xts。您还应该使用yearmon索引,因为您的索引只有几年和几个月。

Text <- "X,Mkt.RF,SMB
196307,-0.39,-0.046
196308, 5.07,-0.810
196309,-1.57,-0.048"

# function adapted from examples in ?read.zoo
z <- read.zoo(text=Text, header=TRUE, sep=",",
              FUN=function(x) as.yearmon(format(x), "%Y%m"))
z
#          Mkt.RF    SMB
# Jul 1963  -0.39 -0.046
# Aug 1963   5.07 -0.810
# Sep 1963  -1.57 -0.048

答案 1 :(得分:0)

由于您未提供任何数据,我将使用与您的描述匹配的小型测试示例。我认为as.POSIXct无法在没有特定日期的情况下发挥作用。您可以使用每月的第一天来完成这项工作。

x = c("201701", "201702", "201703")
xt = as.POSIXct(paste(x, "01", sep=""), format="%Y%m%d")
xts(xt, order.by=xt)
                 [,1]
2017-01-01 1483246800
2017-02-01 1485925200
2017-03-01 1488344400

<强>更新
我看到你现在已经提供了数据并说你正在获得NAs。我正在使用您提供的数据,将其作为csv读取,使用我的代码处理它而不是获取NA。请再次查看此版本的代码。

Input = read.csv(text="X,Mkt.RF,SMB
 196307,-0.39 ,-.046
 196308,5.07  ,-0.81
 196308,-1.57 ,-.048",
header=TRUE, stringsAsFactors=FALSE)

library(xts)
Input$xt = as.POSIXct(paste(Input$X, "01", sep=""), format="%Y%m%d")
xts(Input, order.by=Input$xt)
           X        Mkt.RF  SMB      xt          
1963-07-01 "196307" "-0.39" "-0.046" "1963-07-01"
1963-08-01 "196308" " 5.07" "-0.810" "1963-08-01"
1963-08-01 "196308" "-1.57" "-0.048" "1963-08-01"