我在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()
应该有效。
感谢您的任何想法。
答案 0 :(得分:4)
@SymbolixAU在评论中已经很好地回答了
解决有关data.frame / data.frame差异的问题。
主要区别在于POSIXlt
比POSIXct
占用更多内存,而data.table确实关心内存。
object.size(Sys.time())
#312 bytes
object.size(as.POSIXlt(Sys.time()))
#2144 bytes
重要的是要知道您仍然可以在data.table POSIXlt
参数中使用j
数据类型(及其方法),只需确保在分配给POSIXct
时将其转换为data.table
一栏。
如果由于某种原因你想将POSIXlt存储在data.table中...... ReactCSSTransitionGroup
不支持POSIXlt类型与data.frame相同。您可以将POSIXlt存储在data.table中,但只需将其包装到列表中,就像任何其他非原子数据类型一样。
答案 1 :(得分:1)
等等
data.table(as.Date(date_chr))