看板 R_Language 關於我們 聯絡資訊
※ 引述《jerkoffme (摩德男孩)》之銘言: : [問題類型]: : 資料格式轉換 : [軟體熟悉度]: : 使用者(已經有用R 做過不少作品) : [問題敘述]: : 想將 data.table 格式的 table 叫 pop 並將其中一個變量轉換為時間變量, : 該變量為 char 的格式,但使用日期轉化的函數後最後都會變成數字 : [程式範例]: : 例如 : post_time : 2019/8/28 16:43 : 2019/8/28 15:48 : 但我用 : tdf5 <- sapply(pop$post_time, as.POSIXct, format = "%Y/%m/%d %H:%M") : View(tdf5) : 結果就會變成 : 1566981780 : 1566978480 : 請問為何會這樣 先回答問題,sapply的simplify造成的 可以看一下source code: answer <- lapply(X = X, FUN = FUN, ...) if (!isFALSE(simplify) && length(answer)) simplify2array(answer, higher = (simplify == "array")) simplify2array(x, higher = TRUE): unlist(x, recursive = FALSE, use.names = FALSE) 可以看到sapply用了unlist去做simplify 然後unlist不認得POSIXt這個class (因為它丟進C裡,只用最原本的型別: 整數) 而且它沒有再轉換回去,所以你最後sapply看到的就只剩下整數了 那怎麼做? 兩個方式: 1. 根本不需要用sapply,直接用as.POSIXct做就好: as.POSIXct(DT$post_time) 2. 捨棄sapply改成用lapply + do.call + c取代 do.call(c, lapply(DT$post_time, as.POSIXct)) 另外推文說的lubridate也可以,一樣結果: parse_date_time(DT$post_time, "ymdHM") 或 as_datetime(DT$post_time, format = "%Y/%m/%d %H:%M") : [環境敘述]: : R version 3.5.3 (2019-03-11) : Platform: x86_64-w64-mingw32/x64 (64-bit) : Running under: Windows >= 8 x64 (build 9200) -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 119.14.59.166 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1567164494.A.61E.html ※ 編輯: celestialgod (119.14.59.166 臺灣), 08/30/2019 19:33:18
bboybighead2: 推 很清楚 09/01 13:41
jerkoffme: 感謝解惑 09/13 02:31