【问题标题】:discontinuity in evaluation of midnight POSIXct objects午夜 POSIXct 对象的评估不连续
【发布时间】:2019-07-17 21:15:53
【问题描述】:

我有一个带有日期和时间的 POSIXct 对象向量,其中一个是午夜。

v <- as.POSIXct(c("2019-01-01 23:59:00","2019-01-02 00:00:00"), tz="UTC")

当我评估v 时,它显示正确,

> v
[1] "2019-01-01 23:59:00 UTC" "2019-01-02 00:00:00 UTC"

但是当我单独评估它的元素时,

> v[1]
[1] "2019-01-01 23:59:00 UTC"
> v[2]
[1] "2019-01-02 UTC"

午夜元素被缩短以排除时间,这在我的data.table 连接中造成了麻烦。因此,我想知道是否可以强制对其进行全面评估。

找到答案了!

> strftime(v, format="%Y-%m-%d %H:%M:%S")
[1] "2019-01-01 23:59:00" "2019-01-02 00:00:00" 
> strftime(v[1], format="%Y-%m-%d %H:%M:%S")
[1] "2019-01-01 23:59:00"
> strftime(v[2], format="%Y-%m-%d %H:%M:%S")
[1] "2019-01-02 00:00:00"

设置时区等于系统时区是关键。

【问题讨论】:

  • 你能告诉我你想加入的两个data.tables吗,你想用什么命令来做?
  • 整个连接包括一个图,它通常描述here,除了我也使用as.character(timeA) %chin% names(subcomponent(g, as.character(timeB)))。仔细想想,问题可能出在igraphsubcomponent(.)命令。

标签: r posix posixct


【解决方案1】:

好消息:您的数据仍然可以正确表示。只有print.POSIXct 方法会截断它。 (有问题的代码实际上是在format.POSIXlt 中,所以它只用于在屏幕上渲染数据。)

times <- as.POSIXct("2019-01-01 23:59:00") + c(0, 59, 60, 61)

times
[1] "2019-01-01 23:59:00 EST" "2019-01-01 23:59:59 EST" "2019-01-02 00:00:00 EST"
[4] "2019-01-02 00:00:01 EST"
as.list(times)
[[1]] [1] "2019-01-01 23:59:00 EST"

[[2]] [1] "2019-01-01 23:59:59 EST"

[[3]] [1] "2019-01-02 EST"

[[4]] [1] "2019-01-02 00:00:01 EST"
lapply(as.list(times), class)
[[1]]
[1] "POSIXct" "POSIXt" 

[[2]]
[1] "POSIXct" "POSIXt" 

[[3]]
[1] "POSIXct" "POSIXt" 

[[4]]
[1] "POSIXct" "POSIXt"
lapply(as.list(times), as.numeric)
[[1]]
[1] 1546405140

[[2]]
[1] 1546405199

[[3]]
[1] 1546405200

[[4]]
[1] 1546405201

令人困惑的消息:如果时间在您加入或处理的任何时候被强制转换为字符,它们将不会打印相同的内容,但当您重新强制到某个时间时,它们仍会指向相同的时间。这是因为如果字符串中没有存储 HMS 信息,as.POSIXct 假定为午夜时间。

lapply(as.list(times), as.character)
[[1]]
[1] "2019-01-01 23:59:00"

[[2]]
[1] "2019-01-01 23:59:59"

[[3]]
[1] "2019-01-02"

[[4]]
[1] "2019-01-02 00:00:01"
lapply(lapply(lapply(as.list(times), as.character), as.POSIXct), as.numeric)
[[1]]
[1] 1546405140

[[2]]
[1] 1546405199

[[3]]
[1] 1546405200

[[4]]
[1] 1546405201

igraph 的操作超出了我的专业范围,但是当您有一个复杂的数据类型时,一个好的经验法则是尝试将它存储在一个明确的字符串或数字中。时间是存储为整数的一个很好的例子,因为它们(当前)在底层表示为自 1970-01-01 的 Unix 起源以来的秒数。

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2017-08-24
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2014-11-29
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多