2016-02-25 39 views
2

我在查找高效將數據表中的字符串列轉換爲日期列的方式,但條件是字符串可能處於三種日期格式之一 - 數量,%Y-%m-%d,%m /%d /%Y。將表示各種格式化日期的字符串列轉換爲日期列

下面舉例說明了如何一個假設的功能datefun會表現:

library(data.table) 
dt <- data.table(my_dates = c('42292.7894','2014-06-22','11/25/2011','33661', NA)) 

datefun(dt$my_dates) 
[1] "2015-10-15" "2014-06-22" "2011-11-25" "1992-02-27" NA 

這將是相同的應用as.Date到每個字符串與字符串格式的知識。

l <- dt$my_dates 
c(as.Date(as.numeric(l[1]), origin = "1899-12-30"), 
    as.Date(l[2],'%Y-%m-%d'), 
    as.Date(l[3],'%m/%d/%Y'), 
    as.Date(as.numeric(l[4]), origin = "1899-12-30"), 
    as.Date(l[5])) 
[1] "2015-10-15" "2014-06-22" "2011-11-25" "1992-02-27" NA 

我試圖直接從沒有被格式化的excel直接讀取數據。

+0

您將需要使用正則表達式匹配和條件轉換。例如'stringr'包的'str_extract(dt,'\\ d + - \\ d + - \\ d +')'會提取所有2015-10-15字符串。您可以將as.Date()應用於它們。 'str_extract(dt,'\\ d +。\\ d +')'類型爲42292.7894等。如果您想強制執行某些固定的數字位數,則可以使用更好的模式匹配。 – Gopala

+1

有關於類似問題的幾個問題。看看是否有這些幫助:[一](http://stackoverflow.com/questions/34389139/format-multiple-date-formats-in-one-columns-using-lubridate),[two](http:// stackoverflow.com/questions/25463523/convert-variable-with-mixed-date-formats-to-one-format-in-r),[three](http://stackoverflow.com/questions/13764514/how-to -change-多日期格式合同列)。 – eipi10

+0

非常感謝Gopala對你的建議和eipi10的參考。非常有幫助和啓發。 – Kerry

回答

1

lubridate便於使用。我認爲,關於這一主題的其他問題沒有明確處理小數日以來的起源,所以這裏有雲:

library(lubridate) 
d <- parse_date_time(l, c('%Y-%m-%d', '%m/%d/%Y')) 
d[is.na(d)] <- (ymd_hms("1899-12-30 00:00:00") + as.numeric(l) * 3600 * 24)[is.na(d] 
d 

## [1] "2015-10-15 18:56:44 UTC" "2014-06-22 00:00:00 UTC" "2011-11-25 00:00:00 UTC" 
## [4] "1992-02-27 00:00:00 UTC" NA 

這假設是強制轉換爲數字的l任何元素都是因爲出身格式小數天(具有一致的起源)。

+0

我不知道關於lubridate :: parse_date_time。感謝jbaums的解決方案。 – Kerry

相關問題