r - 午夜 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"
设置时区等于系统时区是关键。
解决方案
好消息:您的数据仍然可以正确表示。只有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 起源以来的秒数。
推荐阅读
- python - 如果用户文件夹在目录中有空格怎么办?
- java - ThreadLocalRandom.current().nextLong() 的最大长度
- r - 如何从具有 NA 的数据框中创建参差不齐的数据框(参差不齐的数组样式)
- javascript - 错误 403 - 返回 FileContentResult 时出现 403 - Aspnet
- excel - 使每组八行移动到 Excel 中的列中
- javascript - 如何根据所选选项禁用/启用所有动态创建的下拉列表中的选项
- angular - 将 Angular 7 更新为 Angular 8
- microservices - 春季 OAuth2 服务来服务客户端凭据
- microsoft-cognitive - 表单识别器标签工具请求表单链接似乎已损坏
- javascript - 源代码在哪里更改以点呈现希伯来文本?PDF JS