R 将数据帧转换为xts
我正在尝试使用as.xts()方法将数据帧转换为xts对象。这是我的输入数据帧q: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
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,有什么区别?@Ahmedovq[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)