【问题标题】:Date time conversion in RR中的日期时间转换
【发布时间】:2023-03-25 10:43:01
【问题描述】:

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

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"

谁能告诉我为什么,如果输入的是日期,即使我指定了正确的时区,我也无法获得 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

我现在很困惑。有没有更快、更优雅的方式将字符转换为日期?还有一个 Date 到一个字符而不是 as.character 这也很慢?

提前谢谢你!

【问题讨论】:

  • 嗨,加文,感谢您的编辑!现在看起来好多了。

标签: r date time


【解决方案1】:

在 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 -- 如果你想在你的时区午夜,使用ISODatetime(2012,1,11,0,0,0)(或任何其他日期)。
  • 谢谢。最好注意srtftime 创建一个“字符”结果,而ISOdatetime(注意“d”没有上限)返回类“POSIXct”,因此它可能更可取。
【解决方案2】:

关于第二个问题,如果您比较as.Date.characteras.Date.POSIXlt 的代码,可能会更清楚。由于您没有指定格式,因此其中一个必须进行更多检查。

至于一般速度,您并没有矢量化您的转化。 as.Datestrptime 以及大多数其他日期/时间转换函数接受日期和日期时间的向量。它会比方式快得多。

【讨论】:

  • 闰秒是在年初添加的,而 DST 从未在 1 月份发生变化,所以我认为您应该删除最后一句话。
  • 我只是想出了类似的函数,如 as.character.Date、as.POSIXlt.POSIXct 等,并且通常指定格式会大大加快速度。在我的情况下,我必须使用循环。好东西,谢谢大家的帮助!
【解决方案3】:

as.POSIXct 的 tz 参数仅用于字符串,否则(静默)忽略。您可能想查看旨在帮助操作日期的包,例如,lubridate 包中的 with_tz 函数。

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多