使用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")
我有如下格式的日期列。我想将其转换为 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")