2014-11-01 62 views
1

我試圖從一個CSV格式的一列數據文件轉換成日期R.格式as.Date在R:不明確的格式和前導零

在此列元素的例子是「6182012」和2012年6月18日和2013年12月10日分別爲「12102013」​​。它們具有整數類型,格式爲[month, without leading zeros][day][year]

但是,我似乎無法讓R識別日期。我試過了:

>>> date.int <- 6182012 
>>> as.Date(date.int, format="%m%d%Y") 
     Error in charToDate(x) : 
      character string is not in a standard unambiguous format 
>>> as.Date(as.character(date.int), format="%m%d%Y") 
     NA 

我不確定爲什麼第一次嘗試不使用我傳遞它的格式字符串,而是嘗試使用標準日期格式。我認爲這是一個類型問題。

我最好的猜測,爲什麼第二次嘗試不起作用的是,沒有一個月有前導零(「6」而不是「06」),而日期都是。

我的問題是:有沒有簡單的方法來通過as.Date一個格式字符串,將此考慮在內?

編輯:我只是想出瞭解決方案,我會發布它只是爲了防止別人遇到這個問題(數據是FEC貢獻數據,所以我假設有人會)。

我認爲不具有幾個月前導零的問題,所以我剛添加一個:

add.zero <- function(dt) { 
    if (nchar(dt) == 7){ 
     return(paste("0", dt, sep="")) 
    } else { 
     return(dt) 
    } 
} 
add.zero(as.character(date.int)) 
# or, if you have a vector of dates 
dates.formatted <- unlist(lapply(dates, add.zero)) 

回答

0
date.int <- c(6182012, 12102013) 

在上述date.int,數字的位數是不同的(7 & 8)。爲了使所有元素的數字位數相同,您可以使用formatCsprintf粘貼前導的0,只要元素缺少8位數字即可。在這裏,我們正在使用sprintf

as.Date(sprintf("%08d", date.int), '%m%d%Y') 
#[1] "2012-06-18" "2013-12-10" 
+0

真棒。比我想出的解決方案更簡單。謝謝! – ahp 2014-11-01 15:29:15

+0

@ Sumurai8是的,我會添加一些文字 – akrun 2014-11-01 16:05:28

1

這裏有一些其他的方式來格式化字符串

x <- c(6182012, 12102013) 
as.Date(chartr(" ", "0", format(x, FALSE)), "%m%d%Y") 
# [1] "2012-06-18" "2013-12-10" 
as.Date(formatC(x, 8, 0, "d", 0), "%m%d%Y") 
# [1] "2012-06-18" "2013-12-10"