У меня есть столбец даты и времени, хранящийся как символ в файле data.table
. Когда я конвертирую в POSIXct, а затем пытаюсь округлить до даты, я получаю странные результаты.
library(data.table)
library(lubridate)
# suppose I have these dates, in a data.table
date_chr <- c("2014-04-09 8:37 AM", "2014-09-16 6:04 PM",
"2014-09-30 3:26 PM", "2014-11-13 12:47 PM",
"2014-11-05 12:25 PM")
dat <- data.table(date_chr)
# I convert to POSIXct...
dat[, my_date := ymd_hm(date_chr)]
# ...and I want to round to date only, but this doesn't work
dat[, date_only := round(my_date, 'days')] # why does this return a list?
dat[, date_only := trunc(my_date, 'days')] # this too
class(dat$date_only)
это list
, и я получаю это предупреждающее сообщение
# Warning message:
# In `[.data.table`(dat, , `:=`(date_only, round(my_date, "days"))) :
# Supplied 9 items to be assigned to 5 items of column 'date_only' (4 unused)
Между тем, это работает отлично!
dat_df <- data.frame(date_chr, stringsAsFactors = F)
dat_df$my_date <- ymd_hm(dat_df$date_chr)
dat_df$date_only <- round(dat_df$my_date, 'days')
class(dat_df$date_only)
равно POSIXlt, POSIXt
, как хотелось бы.
Мой вопрос в том, почему это и как я могу избежать проблемы при использовании data.table
? Есть обходные пути, такие как усечение временной части date_chr
перед преобразованием, но похоже, что round.POSIXt()
должно работать.
Спасибо за любые мысли.
dat[, my_date := as.POSIXct(date_chr, format = "%Y-%m-%d %I:%M")]
, и только для даты:dat[, date_only := as.Date(my_date, tz = "Australia/Melbourne")]
- person SymbolixAU   schedule 29.08.2016round.POSIXt()
, он возвращает список (см.?round.POSIXt
), т. е. объектPOSIXlt
. - person SymbolixAU   schedule 29.08.2016dat_df$date_only <- round(dat_df$my_date, 'days')
приводит к созданию одного нового столбца классаPOSIXt
, а версия data.table — нет. - person arvi1000   schedule 29.08.2016data.table
не поддерживает типы POSIXlt по соображениям производительности. - person SymbolixAU   schedule 29.08.2016data.table
er, чтобы расширить и дать более подробную информацию в ответе. - person SymbolixAU   schedule 30.08.2016