Ошибка при создании R data.table с датой POSIXlt
Проблема с созданием data.table с столбцом даты и времени:
> mdt <- data.table(id=1:3, d=strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S"))
> class(mdt)
[1] "data.table" "data.frame"
> print(mdt)
Error in `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE), :
length of 'dimnames' [1] not equal to array extent
Enter a frame number, or 0 to exit
1: print(list(id = 1:3, d = list(sec = c(36, 48, 12), min = c(2, 2, 3), hour = c(6, 6, 7), mday = c(31,
2: print.data.table(list(id = 1:3, d = list(sec = c(36, 48, 12), min = c(2, 2, 3), hour = c(6, 6, 7), m
3: `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE), ":", sep = ""))
Создавать как data.frame и преобразовывать в data.table работает!
> mdf <- data.frame(id=1:3, d=strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S"))
> print(mdf)
id d
1 1 2014-01-31 06:02:36
2 2 2014-01-31 06:02:48
3 3 2014-01-31 07:03:12
> mdt <- as.data.table(mdf)
> print(mdt)
id d
1: 1 2014-01-31 06:02:36
2: 2 2014-01-31 06:02:48
3: 3 2014-01-31 07:03:12
> class(mdt)
[1] "data.table" "data.frame"
Я что-то пропустил или это ошибка? Если ошибка, где я могу сообщить об этом?
Примечание. Я использую R версии 3.0.0, и я вижу некоторые предупреждения re. пакетов, построенных с версией 3.0.2. Это может быть проблема? Должен ли я обновить R? Все остальное, что я делаю, похоже, работает.
Ответы
Ответ 1
Отформатируйте ответ от комментария Blue Magister (спасибо большое), data.table не поддерживает типы данных POSIXlt для причины производительности - см. строку перевода в IDateTime, как было предложено как возможный дубликат.
Таким образом, путь - это время каста как ITime (тип, предоставленное data.table) или дата-время (или дата) только как POSIXct, в зависимости от того, важна ли информация о дате:
> mdt <- data.table(id=1:3, d=as.ITime(strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S")))
> print(mdt)
id d
1: 1 06:02:36
2: 2 06:02:48
3: 3 07:03:12
> mdt <- data.table(id=1:3, d=as.POSIXct(strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S")))
> print(mdt)
id d
1: 1 2014-01-31 06:02:36
2: 2 2014-01-31 06:02:48
3: 3 2014-01-31 07:03:12
В качестве дополнительной заметки, если кто-то может воспользоваться ею, я хотел бы создать дату и время из моих входных данных с датой и временем в отдельных полях.
Мне было полезно узнать (см. ITime), что можно добавить время ITime в POSIXct с датой и получить POSIXct с датой времени следующим образом:
> mdt <- as.POSIXct("2014-01-31") + as.ITime("06:02:36")
> print(mdt)
[1] "2014-01-31 06:02:36 EST"
> class(mdt)
[1] "POSIXct" "POSIXt"