【问题标题】:Adding lubridate dates to vector changes timezone and thus date将 lubridate 日期添加到矢量更改时区,从而更改日期
【发布时间】:2015-07-14 14:15:25
【问题描述】:

在 R 包 lubridate 中,我可以使用以下语法轻松创建日期:

> mdy("5/4/2015")

正如预期的那样,它会产生以下结果:

[1] "2015-05-04 UTC"

但是,如果我尝试将这个值添加到数组中,它似乎会从 UTC 更改为我的本地时间 (EDT):

> c(mdy("5/4/2015"))
[1] "2015-05-03 20:00:00 EDT"

由于我不关心时间,这不会对我产生太大影响,只是这会导致日期向后移动 1,如下所示:

> day(mdy("5/4/2015"))
[1] 4
> day(c(mdy("5/4/2015")))
[1] 3

对我来说,向数组中添加一些东西的行为不应该改变那个东西的价值。我在这里遗漏了什么吗?有没有办法解决这个问题?

【问题讨论】:

  • 试试Sys.setenv(TZ="UTC")
  • 谢谢;这似乎可以解决症状,我对此表示赞赏,但我仍然对我放入向量中的值可能不是我从向量中拉出的值感到不舒服。我不确定我是否对 R 的工作原理有一些基本的误解,或者这是否是 lubridate 中的一些怪癖。

标签: r date lubridate


【解决方案1】:

这是因为 lubridate::mdy 假定为 UTC。当你将它包裹在c() 周围时,它会恢复到你的本地时区EDT,因为c() 不会传递timezone 属性:

> attr(mdy("5/4/2015", tz = "EDT"), "tzone")
# [1] "EDT"
> attr(c(mdy("5/4/2015", tz = "EDT")), "tzone")
# NULL

你可以这样做:

Sys.setenv(TZ = "UTC")

将您的本地时区设置为UTC

或者,您可以在mdy() 中明确指定时区:

mdy("5/4/2015", tz = "UTC")

【讨论】:

  • 我想我仍然对这有什么关系感到困惑。从我的角度来看,如果我将一个值放入一个数组并立即向数组询问该值,它们最好是相同的。这种类型的东西在 R 中很常见吗?
【解决方案2】:

除了 Steven 的解决方案,您还可以将日期存储在列表中

list(mdy("5/4/2015"))[[1]]
#[1] "2015-05-04 UTC"

这不会删除时区,您也不必弄乱环境变量。 我同意你的观点:如果你将 c 视为某种形式的“向量”构造函数,并且你来自 C++ 或类似背景,那么删除属性(名称除外)肯定看起来很奇怪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2020-10-22
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多