结合POSIXct给出了错误的时间

sve*_*son 4 time r concatenation posixct

我有一个我试图使用的日期列表,Reduce并意识到当我合并矢量时,小时数正在改变.这是一个例子:

x = structure(1315714440, tzone = "UTC", class = c("POSIXct", "POSIXt"))
y = structure(1325832660, tzone = "UTC", class = c("POSIXct", "POSIXt"))
x
[1] "2011-09-11 04:14:00 UTC"
y
[1] "2012-01-06 06:51:00 UTC"
c(x,y)
[1] "2011-09-11 00:14:00 EDT" "2012-01-06 01:51:00 EST"
Run Code Online (Sandbox Code Playgroud)

为什么会这样?对替代品的任何建议?

谢谢!

Hen*_*rik 5

c.POSIXct删除时区属性.来自?c.POSIXct:

c在" POSIXct"对象上使用[...] 会删除任何" tzone"属性(即使它们都标有相同的时区).

因此,在您之后c(x,y),您可以UTC使用以下方法恢复原始时区attr:

xy <- c(x, y)
attr(xy, "tzone") <- "UTC"
xy
# [1] "2011-09-11 04:14:00 UTC" "2012-01-06 06:51:00 UTC" 
Run Code Online (Sandbox Code Playgroud)

更多Ripley的背景:

c(a,b)用于具有tzone属性的POSIXct对象?

"我们考虑c()保留时区,如果它对所有对象都是通用的,但主要问题c()是记录了删除属性:

c有时用于删除除名称之外的属性的副作用,例如将数组转换为向量. as.vector这是一种更直观的方式,但也会删除名称.另请注意,除了默认方法之外的方法不需要这样做(并且它们几乎肯定会保留一个类属性).

因此,有时删除和有时保留属性会让人感到困惑.

但无论如何,文档(?c.POSIXct)很明确:

使用c" POSIXlt"对象将它们转换为当前时区,而" POSIXct"对象将删除任何" tzone"属性(即使它们都标记有相同的时区).

所以推荐的方法是添加一个" tzone"属性,如果你知道你想要它. POSIXct对象是绝对时间:时区仅影响它们的转换方式(包括打印字符)."


@aosmith所述,rbind可以用作解决方法:

做c时如何保留时区(POSIXct)