我有一个带有日期和时间的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"
设置与系统时区相同的时区是关键。
答案 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起源以来的秒数。