首页 > 解决方案 > 午夜 POSIXct 对象的评估不连续

问题描述

我有一个带有日期和时间的 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"

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

标签: rposixposixct

解决方案


好消息:您的数据仍然可以正确表示。只有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

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

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 起源以来的秒数。


推荐阅读