2016-05-03 37 views
2

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

'as.Date(聘用,C(REP ('%B%d',8),'%Bt%d',rep('%B%d',4)))' – alistaire

+0

或更好,'lubridate :: parse_date_time(employ,c('%B% d','%Bt%d'),exact = TRUE) – alistaire

回答

3

正如您所看到的,您的gsub表达式失败,因为它从其他字符串(如“Oct”)中删除了额外的“t”字符。

您可以轻松地只修改所需的字符串:

sub("Sept", "Sep", employ) 

sub,因为你需要每向量入口只有一个替代是用来代替gsub

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类。

+0

尽管接受的答案适用于这个例子,但我相信这是最好的答案,因为它可以处理大多数**案例(只要前3个字符是正确的拼写)。 – SymbolixAU

+0

@Symbolix我同意。提问者注意,您可以随时以任何理由随意改变复选标记的分配。 –

+0

@Gracos没关系。你在MatthewLundberg的帖子中保留已接受的答案,因为他首先回答并且为发布的例子工作。无论如何,这是另一种选择。 – akrun

2

lubridate包的parse_date_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" 
相关问题