R中子集化POSIXlt和POSIXct之间的差异

时间:2015-03-11 20:09:21

标签: r timestamp posixct subset posixlt

DATA

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

OPERATIONS

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一起使用的等效操作是什么?
非常感谢

1 个答案:

答案 0 :(得分:9)

您误解了POSIXltPOSIXct之间的重要区别:

  • POSIXlt是一个&#39;列表类型&#39;使用您可以访问的组件
  • POSIXct是&#39;紧凑型&#39;这基本上只是一个数字

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

对这些做POSIXltstr()很有启发性。由于历史原因,unclass会返回strptime()。我希望它会返回POSIXlt