我知道已经讨论了类似的事情,但是这里有一些我还没有找到答案的事情。
> Sys.timezone()
[1] "EST"
> as.POSIXct("2011-01-30")
[1] "2011-01-30 EST"
> as.POSIXct(as.Date("2011-01-30"))
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="EST")
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="GMT")
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="America/New_York")
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="")
[1] "2011-01-29 19:00:00 EST"
任何人都可以告诉我为什么,如果输入是日期,即使我指定了正确的时区,我也无法在1月30日午夜到达?如果输入是字符串,那么我没关系。
两者都非常缓慢。然后我发现要将字符串转换为Date,实际上通过首先将其转换为POSIXlt要快得多:
> d3.str = "2011-03-02 23:59:00";
> N=10000
> system.time(for(i in 1:N) r5.dt = as.Date(d3.str))
user system elapsed
1.25 0.00 1.24
> system.time(for(i in 1:N) r6.dt = as.Date(strptime(d3.str, format="%Y-%m-%d")))
user system elapsed
0.37 0.00 0.38
> r5.dt
[1] "2011-03-02"
> r5.dt==r6.dt
[1] TRUE
我现在很困惑。有没有更快,更优雅的方式将角色转换为日期?和一个角色的日期而不是as.character也很慢?
提前谢谢!
答案 0 :(得分:7)
在as.POSIXct帮助页面的早期,我们读到:“没有时间的日期被视为在午夜UTC。”你期望'tz'参数会修改它是完全错误的。如果您将输出指定为UCT,则可以获取原始日期:
strftime(as.POSIXct(as.Date("2011-01-30")), format="%Y-%m-%d %H:%M:%S", tz="UCT")
#[1] "2011-01-30 00:00:00"
如果您真的只想要约会,那么您应该使用as.Date
。
答案 1 :(得分:4)
至于你的第二个问题,如果你比较as.Date.character
和as.Date.POSIXlt
的代码,可能会更清楚。由于你没有指定格式,其中一个必须做更多的检查。
至于一般速度,您没有对转换进行矢量化。 as.Date
和strptime
以及大多数其他日期/时间转换函数接受日期和日期时间的向量。它会比方式快得多。
答案 2 :(得分:2)
as.POSIXct的tz
参数仅用于字符串,否则忽略(静默)。您可能希望查看旨在帮助操纵日期的包,例如with_tz
包中的lubridate
函数。