我有一个字符格式的日期向量我需要转换为日期格式。有些月份是缩写的,有些则没有,因为这个列表是网页报废的结果。由于某种原因,以下内容未能转换为“9月7日”(其余部分适用):
employ <- c("Jan 5", "Feb 2", "March 9", "April 6", "May 4", "June 1","July 6", "Aug 3", "Sept 7", "Oct 5", "Nov 2", "Dec 7","Jan 4")
employ2 <- as.Date(employ, format = "%B %d")
#This is what the output of employ2 looks like:
[1] 2016-01-05 2016-02-02 2016-03-09 2016-04-06 2016-05-04 2016-06-01
[7] 2016-07-06 2016-08-03 <NA> 2016-10-05 2016-11-02 2016-12-07
[13] 2016-01-04
我认为问题可能是9月份的“t”,所以我用gsub
把它拿出来了。在这种情况下,代码无法转换“10月5日”。
employ <- c("Jan 5", "Feb 2", "March 9", "April 6", "May 4", "June 1","July 6", "Aug 3", "Sept 7", "Oct 5", "Nov 2", "Dec 7","Jan 4")
employ <- gsub("t", "", employ)
employ2 <- as.Date(employ, format = "%B %d")
有人可以帮助成功转换整个列表吗?非常感谢。
编辑:请不要回复,显然问题确实是“t”。刚发现它。需要弄清楚从9月开始删除“t”的不同方法。答案 0 :(得分:3)
如您所见,您的gsub
表达式失败,因为它从其他字符串中删除了其他“t”字符,例如“Oct”。
您可以轻松修改所需的字符串:
sub("Sept", "Sep", employ)
使用 sub
代替gsub
,因为每个向量条目只需要一次替换。
答案 1 :(得分:3)
我们只能从非数字部分获取前3个字符,然后应用as.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
类。
答案 2 :(得分:2)
lubridate
包的parse_date_time
可以处理可能格式的向量,但需要exact = TRUE
设置,以便将额外的t
解释为字符,而不是令牌:< / p>
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"