在将数据帧转换为xts
I时,我意识到格式化程序出了问题.这是一个示例数据帧:
effective_date price "1990-01-01" "100" "1990-01-02 00:05:00" "200"
这是我使用的包的示例输出.
将其转换xts
为直接的
xts(df["price"], order_by=as.POSIXct(df["effective_date"], format="%Y-%m-%d %H:%M:%S")
但是这个错误出来了,说NAs
不能在行名中,结果是:
100 1990-01-02 00:05:00 200
显然xts
无法弄清楚如何处理那里的奇怪日期(午夜)并且它不会强迫它.
如果我添加tz="UTC"
到as.POSIXct
它不能正常工作.此外,as.POSIXlt
这里也没有任何改变.
我该怎样做才能将午夜日期强制为正确的格式?
两个问题:
1)您不能将日期单独解析为具有给定格式的POSIXct:
R> as.POSIXct(c("2017-01-02", "2017-01-03 04:05:06"), format="%Y-%m-%d %H:%M:%S") [1] NA "2017-01-03 04:05:06 CST" R>
2)但是您可以使用该anytime()
功能来执行此操作:
R> anytime::anytime(c("2017-01-02", "2017-01-03 04:05:06")) [1] "2017-01-02 00:00:00 CST" "2017-01-03 04:05:06 CST" R>
一旦你有了POSIXct
,形成xts
就很容易了.
另请注意,您有拼写错误:您需要在列指示符之前使用逗号:df[, "price"]
.
编辑:对@ 42关于Gabor的(精细)解决方案"主导"这个问题的评论有点厌倦,所以这里是最小的基准:
R> library(microbenchmark) R> v <- c("2017-01-02", "2017-01-03 04:05:06") R> library(anytime) R> print(microbenchmark(anytime(v), do.call("c", lapply(v, as.POSIXct))), digits=3) Unit: microseconds expr min lq mean median uq max neval cld anytime(v) 33.6 36.8 42.1 45.6 46.6 80.7 100 a do.call("c", lapply(v, as.POSIXct)) 571.5 579.1 586.4 586.8 589.5 695.7 100 b R>
所以简而言之"不是真的".它只使用R Base,这是一个加号,它是a)更难阅读和理解,b)更有限,因为它只处理一种格式(ISO风格)和c)它慢大约十三倍.
1)要获取"POSIXct"
日期时间向量,请尝试"POSIXct"
单独转换每个日期时间,然后将它们连接在一起:
do.call("c", lapply(df$effective_date, as.POSIXct))
2)另一个基本解决方案甚至更短并且速度也更快,以下是依赖于最后as.POSIXct
忽略垃圾的事实.
as.POSIXct(paste(df$effective, "00:00:00"))