在R中格式化as.Date:不明确格式和前导零

时间:2014-11-01 15:23:48

标签: r csv

我试图将CSV文件中的一列数据格式化为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

我不确定为什么第一次尝试不使用我传递的格式字符串,而是尝试使用标准日期格式。我认为这是一个类型问题。

我最好的猜测,为什么第二次尝试不起作用的是,没有一个月有前导零(&#34; 6&#34;而不是&#34; 06&#34;),而约会都做。

我的问题是:是否有一种简单的方法可以传递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))

2 个答案:

答案 0 :(得分:1)

date.int <- c(6182012, 12102013)

在上面的date.int中,位数不同(7&amp; 8)。为了使所有元素的位数相同,您可以使用formatCsprintf在元素缺少8位数时粘贴前导0。在这里,我们使用sprintf

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

答案 1 :(得分: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"