午夜POSIXct对象评估中的不连续性

时间:2019-07-17 21:15:53

标签: r posix 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"

设置与系统时区相同的时区是关键。

1 个答案:

答案 0 :(得分:0)

好消息:您的数据仍然可以正确表示。只是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年1月1日Unix起源以来的秒数。