为什么将新系列添加到动物园对象时会删除时区属性

Why does the time zone attribute get dropped when I add a new series to a zoo object

当我向它添加新的时间序列时,我的动物园对象的时区属性被删除。 例如,

library(zoo)
ZooObject=zoo(data.frame(a=1:5),
          seq(as.POSIXct("2014-01-01 00:00:01",tz="UTC"),
              as.POSIXct("2014-01-01 00:00:05",tz="UTC"),
              by=1)
)
attr(time(ZooObject),'tzone')
#"UTC"
ZooObject$b <- 2
attr(time(ZooObject),'tzone')
#NULL

创建 zoo 对象后正确报告了时区属性,但在添加第二个系列后时区消失了(默认为语言环境)。

这给我带来了麻烦,因为我后来将每小时的数据汇总为每天的数据,因此保留正确的时区很重要。 我的解决方案是不断重新设置时区属性。

attr(time(ZooObject),'tzone') <- "UTC"

这类似于merge.zoo removes time zone

有没有办法阻止时区被剥离?

避免这种行为的一个简单方法是使用 xts 而不是 zoo。如果需要,您可以在进行所需的转换后将对象重新分类为动物园。

library(xts)
library(zoo)

ZooObject=zoo(data.frame(a=1:5),
              seq(as.POSIXct("2014-01-01 00:00:01",tz="UTC"),
                  as.POSIXct("2014-01-01 00:00:05",tz="UTC"),
                  by=1)
)

test <- as.xts(ZooObject)

attr(time(test), 'tzone')
#> [1] "UTC"

test$b <- 2
attr(time(test), 'tzone')
#> [1] "UTC"

test2 <- as.zoo(test)
attr(time(test2), 'tzone')
#> [1] "UTC"