2009-12-11 2 views
1

У меня есть вектор символов нижеНеожиданное значение длины вектора в R

a = c("2009-07-31 18:00:33", "2009-07-31 18:00:38", "2009-07-31 18:00:43", "2009-07-31 18:00:49", "2009-08-01 01:58:49", "2009-08-01 01:53:16", "2009-08-01 08:04:13", "2009-08-01 16:16:13") 

Я хочу, чтобы преобразовать это время объекты, так что я это сделать:

b = strptime(a, "%Y-%m-%d %H:%M:%S") 

Почему а и Ь имеют разную длину?

> length(a) 
[1] 8 
> length(b) 
[1] 9 

ответ

1

Объект b имеет класс POSIXlt. Массивы POSIXlt даты всегда возвращает длину 9, с представляют собой именованный список из девяти векторов:

R> class(b) 
[1] "POSIXt" "POSIXlt" 

R> unclass(b) 
$sec 
[1] 33 38 43 49 49 16 13 13 
$min 
[1] 0 0 0 0 58 53 4 16 
$hour 
[1] 18 18 18 18 1 1 8 16 
$mday 
[1] 31 31 31 31 1 1 1 1 
$mon 
[1] 6 6 6 6 7 7 7 7 
$year 
[1] 109 109 109 109 109 109 109 109 
$wday 
[1] 5 5 5 5 6 6 6 6 
$yday 
[1] 211 211 211 211 212 212 212 212 
$isdst 
[1] 1 1 1 1 1 1 1 1 

класса POSIXct, который представляет собой (подпись) количество секунд с начала 1970 как числовой вектор, дает ожидаемую длину:

R> length(as.POSIXct(a)) 
[1] 8 
R> unclass(as.POSIXct(a)) 
[1] 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 
[8] 1.249e+09 
attr(,"tzone") 
[1] "" 
+0

Я получаю его сейчас. Вектор не контейнер, как я думал. Являются ли времена, хранящиеся в b на самом деле объектами? У вас есть ссылка на объект POSIXlt? – hekevintran

+0

Я имел в виду, что список не является контейнером, как я думал. – hekevintran

0

Как вы можете видеть в ?strptime он преобразует строку символов в класс POSIXlt. В R существует два типа раз: POSIXlt и POSIXct. Описание в ?DateTimeClasses, но ярлык:

Класс «POSIXct» представляет собой (подпись) количество секунд с момента начала 1970 в качестве числового вектора.

Класс «POSIXlt» является именованным список векторов, представляющих сек 0-61: сек мин 0-59: мин час 0-23: 1-31 часов MDAY: день месяца пн 0-11 : месяцы после первого из года. год Years since 1900. wday 0-6 день недели, начало сверху воскресенье. yday 0-365: день год. isdst Летнее время флаг. Положительно, если в силе, ноль, если нет, отрицательный, если неизвестен.

Таким образом, ваш b - это список из 9 векторов длиной по 8 раз.

Вы можете увидеть:

sapply(b,length) 

Вы можете использовать точное преобразование:

b_1 = as.POSIXlt(a, "%Y-%m-%d %H:%M:%S",tz="") 
b_2 = as.POSIXct(a, "%Y-%m-%d %H:%M:%S",tz="") 

length(b_1) # 9 
length(b_2) # 8 
0

Просто для записи, этот FAQ вопрос собирается изменить в R 2.11.0:

2.11.0 НОВЫЕ ХАРАКТЕРИСТИКИ

длина (POSIXlt) теперь повторно превращает длину соответствующего абзаца timedate-vector, а не всегда 9 (длина основного списка ). (Желание PR # 14073 и PR # 10507.)

Это от вступления декабря 2 RSS потока с кратким изложением ежедневных изменений в архиве Subversion, в developer page для получения подробной информации о кормах.

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