Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将数据帧转换为xts_R_Dataframe_Coerce_Xts_Time Series - Fatal编程技术网

R 将数据帧转换为xts

R 将数据帧转换为xts,r,dataframe,coerce,xts,time-series,R,Dataframe,Coerce,Xts,Time Series,我正在尝试使用as.xts()方法将数据帧转换为xts对象。这是我的输入数据帧q: q t x 1 2006-01-01 00:00:00 1 2 2006-01-01 01:00:00 2 3 2006-01-01 02:00:00 3 str(q) 'data.frame': 10 obs. of 2 variables: $ t: POSIXct, format: "2006-01-01 00:00:00

我正在尝试使用as.xts()方法将数据帧转换为xts对象。这是我的输入数据帧q:

q
                      t x  
1  2006-01-01 00:00:00  1  
2  2006-01-01 01:00:00  2  
3  2006-01-01 02:00:00  3

str(q)
    'data.frame':   10 obs. of  2 variables:
 $ t: POSIXct, format: "2006-01-01 00:00:00" "2006-01-01 01:00:00" "2006-01-01 02:00:00" "2006-01-01 03:00:00" ...  
 $ x: int  1 2 3 4 5 6 7 8 9 10
结果是:

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

这是我能想到的最简单的例子,所以它不能正常工作是相当令人沮丧的。。。感谢您的帮助

那么,as.xts默认假定日期存储在data.frame的行名中。因此出现了错误消息。快速而肮脏的解决方案是:

rownames(q) = q[1]
as.xts(q)
但是您会得到一个带有日期字符串的额外列。理想情况下,您可以用日期作为行名来构建data.frame。

这是有明确文档记录的---对象是通过提供两个参数形成的,一个
向量
矩阵
携带数据和
日期
POSIXct
时钟
。。。键入提供时间信息(或在订购的情况下)

所以做些类似的事情

 qxts <- xts(q[,-1], order.by=q[,1])

qxts这里有一个使用
tidyquant
包的解决方案,它包含一个函数
as_xts()
,该函数将数据帧强制到xts对象。它还包含
as_tibble()
以将xts对象强制转换为tibble(“整洁的”数据帧)

重新创建数据帧(请注意,日期时间类用于“整洁”数据帧,但可以使用任何明确的日期或日期时间类):


返回是一个
xts
对象,具有正确的日期或日期时间作为行名。

以下是一个可行的解决方案:

library(timetk)
q <- xts::xts(q[,-1], order.by = q$t)
库(timetk)

q我定义了一个长度等于我的tibble行数的索引。仅在单独定义时间序列后,如示例所示:

ti= seq(from = ymd_hm("2000-01-01 00:00"),
to = ymd_hm("2000-01-02 01:00"), by =  "30 min", tz = "UTC")

tbl <- tibble(t =ti,
    x = 1:length(t))
)
[代码]ti=seq(from=ymd_hm(“2000-01-01 00:00”), to=ymd_hm(“2000-01-02 01:00”),by=“30分钟”,tz=“UTC”)
tbl现在看来,它不起作用的原因很清楚,xts不接受TIBLES,即使选择了列,它们仍然存储为TIBLES。核心数据可以转换为矩阵或向量。以下代码起作用:
xls.tbl尝试以下方法

q$t<-as.xts(q, order.by = as.Date(q$t), dateFormat="POSIXct")
qxts <- xts(q[,2],q$t)

q$t一个简单的解决方案是首先将
data.frame
转换为
data.table

library(data.table)

qxts <- as.xts(as.data.table(q))
库(data.table)

qxts您可以简单地执行以下操作

q$t<-as.xts(q, order.by = as.Date(q$t), dateFormat="POSIXct")
qxts <- xts(q[,2],q$t)

qxts谢谢!你帮了我很多,尽管答案很简单!(这对我来说并不明显,因为我以前没有使用过任何时间序列软件包,而且不知何故也没有从文档中获得)。但是,再次感谢!考虑到“xts:可扩展时间序列”论文明确宣称从data.frame转换是可能的,我也不认为这是显而易见的。再加上我,我认为这实际上不是“清晰记录的”。但多亏了这个答案,我设法找出了一些与原始问题无关的东西。@DamienB(以及其他评论者和up选民),我们非常乐意接受能够使文档更清晰和/或更不复杂的贡献/补丁。OSS的好处在于你可以有所作为(但发表你的意见,而不采取行动,不算)。@DamienB:我“评价”你是因为你是最新的,你在评论中只能“评价”一个人(这很糟糕)。我很高兴与贡献者合作,帮助他们真正理解,但我不能让他们对需要澄清的内容有什么看法。诚实的尝试,无论多么不完美,都是非常值得赞赏的(例如,请参阅R-Forge上的xts FAQ,由一位提问者撰写)。可能应该是:
rownames(q)=q[[1]]
@42,有什么区别?@Ahmedov
q[1]
将是包含向量的列表
q[[1]]
将只是向量。如果
[您可以使用tibble::column_to_rownames设置管道中的行名。此函数现在已被弃用。请改用timetk::tk_xts。您好,欢迎使用Stack Overflow。当回答一个已经有一些答案的问题时,请确保添加一些额外的见解,以了解为什么您提供的响应是实质性的,而不是简单地重复所提供的内容已经过原始海报的审查。这在“仅代码”答案(如您提供的答案)中尤其重要。您需要将您的时间/日期变量转换为数据帧的行名,然后as.xts将起作用。tibble:column_to_rownames(“timevar”)函数将为您提供此功能。
qxts <- xts(q[,2],q$t)