1

に文字として格納された日時列があり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()はずです。

ご意見ありがとうございます。

4

2 に答える 2

4

@SymbolixAUによるコメントですでにかなりよく答えられています。
その問題に関する data.frame/data.frame の違いに関する質問に対処します。
主な違いは、POSIXltよりもはるかに多くのメモリを必要POSIXctとし、data.table がメモリを気にするという事実から来ています。

object.size(Sys.time())
#312 bytes
object.size(as.POSIXlt(Sys.time()))
#2144 bytes

知っておくべき重要なことはPOSIXlt、data.table 引数でデータ型 (およびそのメソッド) を引き続き使用できることです。列に割り当てるときに j必ず変換してください。POSIXct

何らかの理由で POSIXlt を data.table に格納したい場合は、data.framedata.tableと同じように POSIXlt 型をサポートしていません。POSIXlt を data.table に格納できますが、他の非アトミック データ型と同様に、リストにラップするだけです。

于 2016-08-29T08:47:06.040 に答える