我有一个数据表
V1 V2 V3
1: 3 09/09/17 21:31:23 09/09/17 21:31:23
2: 3 09/09/17 22:06:47 09/09/17 22:06:47
3: 3 09/09/17 22:14:29 09/09/17 22:18:17
从此我想将其转换为
V1 V2 V3
1: 3 2017-09-09 21:31:23 2017-09-09 21:31:23
2: 3 2017-09-09 22:06:47 2017-09-09 22:06:47
3: 3 2017-09-09 22:14:29 2017-09-09 22:18:17
V2
和V3
列是字符。
我试过
DT[,V2:=parse_date_time2(V2,orders="YmdHMS",tz="NA")]
DT[,V3:=parse_date_time2(V3,orders="YmdHMS",tz="NA")]
DT[,V2:=strftime(V2, format="%Y/%m/%d %H:%M:%S"]
DT[,V3:=strftime(V3, format="%Y/%m/%d %H:%M:%S"]
但没有奏效。任何帮助表示赞赏。
答案 0 :(得分:1)
使用错误的日期时间格式是一个非常常见的错误,所以我想在SO上必须有一堆重复的问题。
但是,OP正在寻求data.table
和lubridate
parse_date_time2()
功能组合的帮助。根据{{1}},parse_date_time2()
是数字订单的快速C解析器。
?parse_date_time2
library(data.table) library(lubridate) options(datatable.print.class = TRUE) DT[, V2 := parse_date_time2(V2, orders = "mdyHMS")] DT[, V3 := parse_date_time2(V3, orders = "mdyHMS")] DT
可能正确的格式字符串 V1 V2 V3
<int> <POSc> <POSc>
1: 3 2017-09-09 21:31:23 2017-09-09 21:31:23
2: 3 2017-09-09 22:06:47 2017-09-09 22:06:47
3: 3 2017-09-09 22:14:29 2017-09-09 22:18:17
传递给"mdyHMS"
,而OP使用orders
。 (也许,OP已经在所需的输出中指定了日期格式的顺序,但不是它们出现在输入中?)
我说大概是正确的格式字符串,因为日期字符串"YmdHMS"
是不明确的,没有其他信息。该字符串可以解释为09/09/17
,mdy
,dmy
或ymd
。
整个操作可以更简洁地编码为
myd
cols = c("V2", "V3")
DT[, (cols) := lapply(.SD, mdy_hms), .SDcols = cols]
答案 1 :(得分:0)
使用dplyr
和lubridate
:
library(lubridate)
library(dplyr)
df %>%
mutate_at(2:3, dmy_hms)
# A tibble: 3 x 3
V1 V2 V3
<chr> <dttm> <dttm>
1 1: 3 2017-09-09 21:31:23 2017-09-09 21:31:23
2 2: 3 2017-09-09 22:06:47 2017-09-09 22:06:47
3 3: 3 2017-09-09 22:14:29 2017-09-09 22:18:17