R 中子集化 POSIXlt 和 POSIXct 之间的差异
differences between subsetting POSIXlt and POSIXct in R
数据
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
RESULT(子集化成功)
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 一起使用的等效操作是什么?
非常感谢
您误解了 POSIXlt
和 POSIXct
之间的关键区别:
POSIXlt
是一个 'list type' 组件,您可以像您一样访问
POSIXct
是一个 'compact type' 本质上只是一个数字
您几乎总是希望 POSIXct
用于比较和有效存储(例如,在 data.frame
中,或者索引 zoo
或 xts
对象)并且可以使用POSIXlt
访问组件。但是请注意,这些组件遵循 C 库标准,例如当前年份是 115(因为您总是需要添加 1900),工作日从零开始等 pp.
对这些进行 str()
或 unclass
很有启发性。由于历史原因,strptime()
return 是 POSIXlt
。我希望它 return 一个 POSIXct
.
数据
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
RESULT(子集化成功)
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 一起使用的等效操作是什么?
非常感谢
您误解了 POSIXlt
和 POSIXct
之间的关键区别:
POSIXlt
是一个 'list type' 组件,您可以像您一样访问POSIXct
是一个 'compact type' 本质上只是一个数字
您几乎总是希望 POSIXct
用于比较和有效存储(例如,在 data.frame
中,或者索引 zoo
或 xts
对象)并且可以使用POSIXlt
访问组件。但是请注意,这些组件遵循 C 库标准,例如当前年份是 115(因为您总是需要添加 1900),工作日从零开始等 pp.
对这些进行 str()
或 unclass
很有启发性。由于历史原因,strptime()
return 是 POSIXlt
。我希望它 return 一个 POSIXct
.