当前位置:  开发笔记 > 开发工具 > 正文

R从日期开始下降小时,分钟和秒

如何解决《R从日期开始下降小时,分钟和秒》经验,为你挑选了2个好方法。

在将数据帧转换为xtsI时,我意识到格式化程序出了问题.这是一个示例数据帧:

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> Dirk Eddelbu..:

两个问题:

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)它大约十三倍.


我认为G.Grothendeick的基本解决方案将占据主导地位.

2> G. Grothendi..:

1)要获取"POSIXct"日期时间向量,请尝试"POSIXct"单独转换每个日期时间,然后将它们连接在一起:

do.call("c", lapply(df$effective_date, as.POSIXct))

2)另一个基本解决方案甚至更短并且速度也更快,以下是依赖于最后as.POSIXct忽略垃圾的事实.

as.POSIXct(paste(df$effective, "00:00:00"))

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有