Это связано с тем, что strptime()
является объектом класса "POSIXlt"
:
> ps = data.frame(t(rep(NA, 2)))
> ps[1,1] = strptime('10:30:00', '%H:%M:%S')
Warning message:
In `[<-.data.frame`(`*tmp*`, 1, 1, value = list(sec = 0, min = 30L, :
provided 9 variables to replace 1 variables
> strptime('10:30:00', '%H:%M:%S')
[1] "2012-03-21 10:30:00"
> class(strptime('10:30:00', '%H:%M:%S'))
[1] "POSIXlt" "POSIXt"
A "POSIXlt"
объект является представлением списка (следовательно, lt
вместо ct
в имени класса) времени:
> foo <- strptime('10:30:00', '%H:%M:%S')
> str(foo)
POSIXlt[1:1], format: "2012-03-21 10:30:00"
> unclass(foo)
$sec
[1] 0
$min
[1] 30
$hour
[1] 10
$mday
[1] 21
$mon
[1] 2
$year
[1] 112
$wday
[1] 3
$yday
[1] 80
$isdst
[1] 0
A "POSIXlt"
объект представляет собой список длиной 9:
> length(unclass(foo))
[1] 9
отсюда и предупреждающее сообщение, поскольку объектбыть раздетым назад к его составным частям / представлению.Вместо этого вы можете вставить представление "POSIXct"
, не генерируя предупреждение:
> ps[1,1] = as.POSIXct(strptime('10:30:00', '%H:%M:%S'))
> ps[1,1]
[1] 1332325800
, но мы все еще теряем информацию о классе.Тем не менее, вы можете вернуться к представлению "POSIXct"
позже, используя функцию as.POSIXct()
, но вам нужно будет указать аргумент origin
.См. ?POSIXct
для получения более подробной информации.
> class(ps[1,1])
[1] "numeric"
Решение состоит в том, чтобы ps$X1
привести к классу "POSIXct"
до , вставив время:
> ps = data.frame(t(rep(NA, 2)))
> ps <- transform(ps, X1 = as.POSIXct(X1))
> ps[1,1] <- as.POSIXct(strptime('10:30:00', '%H:%M:%S'))
> ps
X1 X2
1 2012-03-21 10:30:00 NA
> str(ps)
'data.frame': 1 obs. of 2 variables:
$ X1: POSIXct, format: "2012-03-21 10:30:00"
$ X2: logi NA
Нет предупреждения (как раньше с as.POSIXct()
), но также сохраняется информация о классе, где она была потеряна.Прочитайте ?`[.data.frame`
, особенно раздел Coercion , в котором есть некоторые детали;но я полагаю, как это понимание принуждения в заменах, как это сложно.