2

数据

v1 <- c("2015-01-05 15:00:00", "2015-01-05 15:45:00", "2015-01-05 15:00:30")

运营

v2 <- strptime(v1, '%Y-%m-%d %H:%M:%S')
str(v2)
POSIXlt[1:3], format: "2015-01-05 15:00:00" "2015-01-05 15:45:00" "2015-01-05 15:00:30"

v3 <- v2[!v2$min]  # create v3 from v2 eliminating min != 00

结果(成功的子集)

str(v3)
POSIXlt[1:2], format: "2015-01-05 15:00:00" "2015-01-05 15:00:30"

现在通过将 v2 强制转换为 POSIXct 来创建 v4(成功)

v4 <- as.POSIXct(v2, format = "%y/%m/%d  %H:%M")

str(v4)
POSIXct[1:3], format: "2015-01-05 15:00:00" "2015-01-05 15:45:00" "2015-01-05 15:00:30"

有问题的操作 - 对 POSIXct 应用与 POSIXlt 相同的子集操作会导致以下错误

v5 <- v4[!v4$min]  # reassign v2 eliminating min != 00

结果(错误)

  Error in v4$min : $ operator is invalid for atomic vectors

问题:
a) 为什么会有这种行为差异?
b) 与 POSIXct 一起使用的等效操作是什么?
非常感谢

4

1 回答 1

10

POSIXlt您误解了和之间的关键区别POSIXct

  • POSIXlt是一种“列表类型”,其中包含您可以访问的组件
  • POSIXct是一种“紧凑型”,本质上只是一个数字

您几乎总是希望POSIXct进行比较和有效存储(例如,在 a 中,或者用 a或对象data.frame索引),并且可以用来访问组件。但是请注意,组件遵循 C 库标准,例如当前年份是 115(因为您总是需要添加 1900),工作日从零开始等等。zooxtsPOSIXlt

str()或做unclass这些是有启发性的。由于历史原因,strptime()返回一个POSIXlt. 我希望它会返回一个POSIXct.

于 2015-03-11T20:13:23.077 回答