as.POSIXct给出了一个意想不到的时区

Sig*_*gyF 12 r zoneinfo posixct

我正在尝试将一个yearmon日期(从动物园包)转换为UTC时区的POSIXct.这就是我试图做的事情:

> as.POSIXct(as.yearmon("2010-01-01"), tz="UTC")
[1] "2010-01-01 01:00:00 CET"
Run Code Online (Sandbox Code Playgroud)

我转换日期时得到的相同:

> as.POSIXct(as.Date("2010-01-01"),tz="UTC")
[1] "2010-01-01 01:00:00 CET"
Run Code Online (Sandbox Code Playgroud)

让它工作的唯一方法是将一个字符作为参数传递:

> as.POSIXct("2010-01-01", tz="UTC")
[1] "2010-01-01 UTC"
Run Code Online (Sandbox Code Playgroud)

我查看了DateTimeClasses,tzsettimezones的文档.我的/ 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"
Run Code Online (Sandbox Code Playgroud)

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

就像Joshua说的那样,时区在as.POSIXct.Date中丢失了.现在我将使用Richies建议手动设置tzone:

attr(x,"tzone")< - 'UTC'

这解决了丢失的tzone的问题,它仅用于演示,而不是像Grothendieck和Dwin建议的内部.

Jos*_*ich 7

这是因为as.POSIXct.Date没有传递....POSIXct.

> as.POSIXct.Date
function (x, ...) 
.POSIXct(unclass(x) * 86400)
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 5

正在代码中正确设置时区.您感知的问题仅在输出阶段.POSIX值均以UTC/GMT为参考.假设日期是午夜时间.午夜UTC 上午1点CET(显然在哪里).

> as.POSIXct(as.yearmon("2010-01-01"), tz="UTC")
[1] "2009-12-31 19:00:00 EST"     # R reports the time in my locale's timezone
> dtval <- as.POSIXct(as.yearmon("2010-01-01"), tz="UTC")
> format(dtval, tz="UTC")         # report the date in UTC  note it is the correct date ... there
[1] "2010-01-01"
> format(dtval, tz="UTC", format="%Y-%m-%d ")
[1] "2010-01-01 "                 # use a format string
> format(dtval, tz="UTC", format="%Y-%m-%d %OS3")
[1] "2010-01-01 00.000"           # use decimal time
Run Code Online (Sandbox Code Playgroud)

查看?strptime许多其他格式的可能性.