2015-03-11 3 views
2

ДАННЫЕразличия между Подменю POSIXlt и POSIXct в 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 

результат (успешный Подменю)

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

Теперь создание v4 путем принуждения v2 к POSIXct (успешно)

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 

ВОПРОСЫ:
а) Почему эта разница в поведение?
b) Что было бы эквивалентной операцией для использования с POSIXct?
Большое спасибо

ответ

7

Вы неправильно понять критическую разницу между POSIXlt и POSIXct:

  • POSIXlt является «список типа» с компонентами вы можете получить доступ, как и вы
  • POSIXct является «компактный тип», который по существу, всего лишь число

Вы почти всегда хотите POSIXct для сравнения и использования (например, в data.frame или проиндексировать объект zoo или xts) и может использовать POSIXlt для доступа к компонентам. Однако следует помнить, что компоненты соответствуют стандартам библиотеки C, например, текущие годы - 115 (как вам всегда нужно добавить 1900), начинаются дни недели с нуля и т. д.

Выполнение str() или unclass на них освещается. По историческим причинам strptime() возвращает POSIXlt. Хотелось бы вернуть POSIXct.

+0

Благодарим вас за разъяснение. Мне было проще упростить POSIXlt (через strptime()), а затем в POSIXct (через as.POSIXct()). Цель - создать объект xts. – jpinelo

+1

Да, доступ к части времени через преобразование кажется естественным, например, из [lubridate] (https://github.com/hadley/lubridate/blob/master/R/accessors-minute.r) 'minute.default <- function (x) as.POSIXlt (x, tz = tz (x)) $ min' – jaimedash

+1

@jaimedash Если вы знаете, что делаете с базой R, вам не нужно lubridate. –

Смежные вопросы