2016-05-03 219 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" 
相關問題