R中的日期时间转换

sun*_*unt 3 time r date

我知道类似的事情已经讨论过但是这里有一些我还没有找到答案的东西.

1:日期到POSIXct

> 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"
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么,如果输入是日期,即使我指定了正确的时区,我也无法在1月30日午夜到达?如果输入是字符串,那么我没关系.

2:日期/字符转换.

两者都非常缓慢.然后我发现要将字符串转换为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
Run Code Online (Sandbox Code Playgroud)

我现在很困惑.有没有更快,更优雅的方式将角色转换为日期?和一个角色的日期而不是as.character也很慢?

先感谢您!

42-*_*42- 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"
Run Code Online (Sandbox Code Playgroud)

如果你真的只想要约会,那么你应该使用as.Date.