将日期列表从字符转换为日期格式

时间:2016-05-03 04:06:54

标签: r date

我有一个字符格式的日期向量我需要转换为日期格式。有些月份是缩写的,有些则没有,因为这个列表是网页报废的结果。由于某种原因,以下内容未能转换为“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”的不同方法。

3 个答案:

答案 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"