R 将日期列表从字符格式转换为日期格式
我有一个字符格式的日期向量,我需要转换为日期格式。有些月份是缩写的,有些则不是,这是因为这个列表是网络抓取的结果。由于某些原因,以下未能转换“9月7日”(适用于其余时间): 是否有人能帮助成功转换整个列表?非常感谢R 将日期列表从字符格式转换为日期格式,r,date,R,Date,我有一个字符格式的日期向量,我需要转换为日期格式。有些月份是缩写的,有些则不是,这是因为这个列表是网络抓取的结果。由于某些原因,以下未能转换“9月7日”(适用于其余时间): 是否有人能帮助成功转换整个列表?非常感谢 编辑:请不要回复,很明显问题确实是“t”。刚刚发现了。需要找出一种不同的方法从9月删除“t”正如您所看到的,您的gsub表达式失败,因为它从其他字符串(如“Oct”)中删除了额外的“t”字符 您可以轻松地仅修改所需的字符串: sub("Sept", "Sep", employ) 使
编辑:请不要回复,很明显问题确实是“t”。刚刚发现了。需要找出一种不同的方法从9月删除“t”正如您所看到的,您的
gsub
表达式失败,因为它从其他字符串(如“Oct”)中删除了额外的“t”字符
您可以轻松地仅修改所需的字符串:
sub("Sept", "Sep", employ)
使用
sub
代替gsub
,因为每个向量条目只需要一个替换。我们只能从非数字部分提取前3个字符,然后应用作为.Date
as.Date(sub("(.{3}).*(\\d+)", "\\1 \\2", employ), format = '%B %d')
#[1] "2016-01-05" "2016-02-02" "2016-03-09" "2016-04-06" "2016-05-04"
#[6] "2016-06-01" "2016-07-06" "2016-08-03" "2016-09-07" "2016-10-05"
#[11] "2016-11-02" "2016-12-07" "2016-01-04"
不需要任何外部包,上述输出为
Date
类。lubridate
包的parse_Date\u time
可以处理可能格式的向量,但需要设置exact=TRUE
以便将额外的t
解释为字符,而不是标记:
library(lubridate)
parse_date_time(employ, c('%B %d', '%Bt %d'), exact = TRUE)
# [1] "2016-01-05 UTC" "2016-02-02 UTC" "2016-03-09 UTC" "2016-04-06 UTC" "2016-05-04 UTC"
# [6] "2016-06-01 UTC" "2016-07-06 UTC" "2016-08-03 UTC" "2016-09-07 UTC" "2016-10-05 UTC"
# [11] "2016-11-02 UTC" "2016-12-07 UTC" "2016-01-04 UTC"
as.Date(employ,c(rep('%B%d',8),'%Bt%d',rep('%B%d',4))
或更好,lubridate::parse_Date_time(employ,c('%B%d','%Bt%d'),exact=TRUE)
虽然接受的答案适用于本例,但我相信这是最好的答案,因为它能处理大多数情况(只要前3个字符拼写正确)我同意。请提问者注意,您可以随时出于任何原因随意更改复选标记的分配。我必须尊重您的意见@格拉科斯,这当然是你的选择,但这个答案显然更好。
as.Date(sub("(.{3}).*(\\d+)", "\\1 \\2", employ), format = '%B %d')
#[1] "2016-01-05" "2016-02-02" "2016-03-09" "2016-04-06" "2016-05-04"
#[6] "2016-06-01" "2016-07-06" "2016-08-03" "2016-09-07" "2016-10-05"
#[11] "2016-11-02" "2016-12-07" "2016-01-04"
library(lubridate)
parse_date_time(employ, c('%B %d', '%Bt %d'), exact = TRUE)
# [1] "2016-01-05 UTC" "2016-02-02 UTC" "2016-03-09 UTC" "2016-04-06 UTC" "2016-05-04 UTC"
# [6] "2016-06-01 UTC" "2016-07-06 UTC" "2016-08-03 UTC" "2016-09-07 UTC" "2016-10-05 UTC"
# [11] "2016-11-02 UTC" "2016-12-07 UTC" "2016-01-04 UTC"