【问题标题】:combining POSIXct gives wrong hours [duplicate]结合 POSIXct 给出错误的时间[重复]
【发布时间】:2019-03-11 04:45:36
【问题描述】:

我有一个日期列表,我试图在上面使用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"

为什么会这样?对替代品有什么建议吗?

谢谢!

【问题讨论】:

  • 我在 R 邮件列表 here 上找到了一个使用 rbind() 的旧解决方法,以避免重新分配时区。

标签: r time concatenation posixct


【解决方案1】:

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

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

因此,按照您的c(x,y),您可以使用attr 恢复原始UTC 时区:

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

Ripley 的更多背景介绍:

c(a, b) for POSIXct objects with tzone attributes?

“我们考虑让c() 保留时区,如果它对所有 对象,但主要问题是 c() 被记录为删除 属性:

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

所以,有时删除有时保留属性会 让人困惑。

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

在“POSIXlt”对象上使用c 会将它们转换为当前时间 区域,并在“POSIXct”对象上删除任何“tzone”属性 (即使它们都标有相同的时区)。

所以推荐的方法是添加一个“tzone”属性,如果你知道的话 你希望它成为。 POSIXct 对象是绝对时间:时区 只会影响它们的转换方式(包括转换为用于打印的字符)。”


作为noted by @aosmithrbind 可以用作解决方法:

how to retain time zone when doing c(POSIXct)

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 2016-03-19
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 2014-01-11
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多