如何在R中将d字符解析为不同的日期格式?

时间:2017-11-13 15:21:06

标签: r date data.table lubridate

我有一个数据表

 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

V2V3列是字符。

我试过

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"]

但没有奏效。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

使用错误的日期时间格式是一个非常常见的错误,所以我想在SO上必须有一堆重复的问题。

但是,OP正在寻求data.tablelubridate 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/17mdydmyymd

整个操作可以更简洁地编码为

myd

数据

cols = c("V2", "V3")
DT[, (cols) := lapply(.SD, mdy_hms), .SDcols = cols]

答案 1 :(得分:0)

使用dplyrlubridate

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