使用R包的日期转换

Date conversion using R package

我有如下格式的日期列。我想将其转换为 yyyy-mm-dd 格式。

|Date_Col|
----------
|14/10/2017 10:58|
|30/09/2017 23:15|
|14/05/2016 21:10|
|16/06/2018 22:10|
|07/06/2016 13:05|
|19/02/2017 13:16|

当我使用 as.Date(df$Date_Col) 时,它 returns "0014-10-20" "0030-09-20" "0014-05-20" "0016-06 -20" "0007-06-20" "0019-02-20"

如果我使用 as.Date(df$Date_Col, "%m/%d/%Y"),它会给出 NA NA NA NA "2016-07-06" NA

如果我使用 library(lubridate)mdy(df$Date_Col),它会给出 NA NA NA NA NA NA 警告信息: 所有格式都无法解析。未找到格式。

关于如何将此列转换为 yyyy-mm-dd 格式的任何建议?

感谢提前抽出时间。

使用 Base R 或 lubridate 包的解决方案的关键是将小时和分钟规范包含到日期转换函数的 format= 参数中,以告诉 R 如何解析时间输入文本字符串中的信息。

转换原始 post 中的值的一种方法是使用 as.POSIXlt() 函数和以下格式语法。我们可以使用 format() 函数以 %Y-%m-%d 格式打印结果对象。

format(as.POSIXlt("14/10/2017 10:58",format="%d/%m/%Y %H:%M"),"%Y-%m-%d")

...以及输出:

> format(as.POSIXlt("14/10/2017 10:58",format="%d/%m/%Y %H:%M"),"%Y-%m-%d")
[1] "2017-10-14"
只要使用 format= 参数并包含 %H:%M 内容,

as.Date() 也可以工作:

format(as.Date("14/10/2017 10:58",format="%d/%m/%Y %H:%M"),"%Y-%m-%d")

> format(as.Date("14/10/2017 10:58",format="%d/%m/%Y %H:%M"),"%Y-%m-%d")
[1] "2017-10-14"

通过lubridate包,我们可以使用as_date()

library(lubridate)
format(as_date(df$Date,format="%d/%m/%Y %H:%M"),"%Y-%m-%d")

> format(as_date(df$Date,format="%d/%m/%Y %H:%M"),"%Y-%m-%d")
[1] "2017-10-14" "2017-09-30" "2016-05-14" "2018-06-16" "2016-06-07" "2017-02-19" 

原始 post 日期列表的可重现示例如下所示。

textData <- "Date
14/10/2017 10:58 
30/09/2017 23:15 
14/05/2016 21:10 
16/06/2018 22:10 
07/06/2016 13:05 
19/02/2017 13:16"

df <- read.csv(text=textData,header=TRUE,colClasses = "character")

format(as.Date(df$Date,format="%d/%m/%Y %H:%M"),"%Y-%m-%d")

...以及输出:

> format(as.Date(df$Date,format="%d/%m/%Y %H:%M"),"%Y-%m-%d")
[1] "2017-10-14" "2017-09-30" "2016-05-14" "2018-06-16" "2016-06-07" "2017-02-19"

使用 lubridate 中的 dmy_hm 将数据转换为日期时间。

library(lubridate)
dmy_hm(df$Date_Col)

#[1] "2017-10-14 10:58:00 UTC" "2017-09-30 23:15:00 UTC"
#[3] "2016-05-14 21:10:00 UTC" "2018-06-16 22:10:00 UTC"
#[5] "2016-06-07 13:05:00 UTC" "2017-02-19 13:16:00 UTC"

如果您只需要日期,请在上面的输出中添加 as.Date

as.Date(dmy_hm(df$Date_Col))
#[1]"2017-10-14" "2017-09-30" "2016-05-14" "2018-06-16" "2016-06-07" "2017-02-19"

数据

df <- structure(list(Date_Col = c("14/10/2017 10:58", "30/09/2017 23:15", 
"14/05/2016 21:10", "16/06/2018 22:10", "07/06/2016 13:05", "19/02/2017 13:16")),
row.names = c(NA, -6L), class = "data.frame")