将lubridate日期添加到向量中会更改时区,因此也更改了日期。

5
在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"

既然我不关心时间,这并不会对我产生太大影响,除了导致日期向后移动一天,具体如下:

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

在我的理解中,将某些东西添加到数组中不应该改变它的值。我是否漏掉了什么,有没有办法解决这个问题?


1
尝试使用 Sys.setenv(TZ="UTC") - Steven Beaupré
谢谢,这似乎解决了我感激的症状,但我仍然不舒服,因为我放入向量中的值可能不是我从向量中取回的值。我不确定我是否对R的工作方式有什么基本的误解,或者这是lubridate中的一些怪癖。 - Michael McGowan
2个回答

4

这是因为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")

1
我想我仍然困惑于这个问题的重要性。在我看来,如果我将一个值放入数组中并立即请求该值,它们应该是相同的。在R中,这种情况常见吗? - Michael McGowan

1
除了Steven的解决方案之外,您还可以将日期存储在列表中。
list(mdy("5/4/2015"))[[1]]
#[1] "2015-05-04 UTC"

这不会移除时区,也不需要操作环境变量。 我同意你的观点:如果你把c看作是一个“向量”的某种构造函数,并且你来自于C++或类似的背景,那么去除属性(除了名称)肯定看起来很奇怪。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接