我正在尝试将yearmon日期(来自zoo包)转换为 UTC 时区中的 POSIXct。这就是我试图做的:
> as.POSIXct(as.yearmon("2010-01-01"), tz="UTC")
[1] "2010-01-01 01:00:00 CET"
转换日期时得到相同的结果:
> as.POSIXct(as.Date("2010-01-01"),tz="UTC")
[1] "2010-01-01 01:00:00 CET"
让它工作的唯一方法是传递一个字符作为参数:
> as.POSIXct("2010-01-01", tz="UTC")
[1] "2010-01-01 UTC"
我查看了DateTimeClasses、tzset和timezones的文档。我的 /etc/localtime 设置为 Europe/Amsterdam。除了设置 TZ 环境变量之外,我找不到将 tz 设置为 UTC 的方法:
> Sys.setenv(TZ="UTC")
> as.POSIXct(as.Date("2010-01-01"),tz="UTC")
[1] "2010-01-01 UTC"
从 yearmon 或 Date 创建 POSIXct 时是否可以直接设置时区?
编辑:
我检查了函数 as.POSIXct.yearmon。这个传递给 as.POSIXct.Date。
> zoo:::as.POSIXct.yearmon
function (x, tz = "", ...)
as.POSIXct(as.Date(x), tz = tz, ...)
<environment: namespace:zoo>
所以就像 Joshua 说的时区在 as.POSIXct.Date 中丢失了。现在我将使用 Richies 的建议来手动设置 tzone:
attr(x, "tzone") <- 'UTC'
这解决了丢失 tzone 的问题,它仅用于演示,而不像 Grothendieck 和 Dwin 建议的那样在内部使用。