我在R中遇到日期问题。
我有一些日期数据,但格式不一致。根据当天的日期,它存储为dmmyyyy或ddmmyyyy。为了解决这个问题,我编写了一个小函数(见下文),它接受字符串,检查长度,重新格式化然后返回日期。我使用sapply(日期,formatDate)并根据我的打印输出一切正常工作。但是,结果向量不包含相同的值。
头(日期) 10651 11566 15493 13727 15920 15617
我不确定这里发生了什么,有什么见解吗?
formatDate <- function(x){
print(paste("Entering format date for ", x))
if (nchar(x) == 8){
print(paste("nchar = ", nchar(x)))
day <- substr(x, 1, 2)
month <- substr(x, 3, 4)
year <- substr(x, 5, 8)
print(paste("Day = ", day, " month = ", month, " year = ", year))
x <- paste(year,"-",month,"-",day, sep = "")
print(paste("Date = ", x))
x <- as.Date(x, format = "%Y-%m-%d")
}else if (nchar(x) == 7){
day <- substr(x, 1, 1)
day <- format(day, digits = 2)
day <- gsub(" ", 0, day)
month <- substr(x, 2, 3)
year <- substr(x, 4, 7)
x <- paste(year,"-",month,"-",day, sep = "")
x <- as.Date(x, format = "%Y-%m-%d")
} else {
x <- NA
}
print(paste("Returning", x))
flush.console()
return(x)
}
答案 0 :(得分:2)
这看起来太复杂了。如果我理解正确,你可以这样做:
x <- c("1072015", "11072015")
as.Date(formatC(as.integer(x), width = 8, flag = 0), format = "%d%m%Y")
#[1] "2015-07-01" "2015-07-11"
答案 1 :(得分:0)
尽管Roland是正确的,这需要一种完全不同的方法,但实际上我在寻找OP问题的答案:使用sapply()
从函数返回日期。
简单的答案是:sapply()
无法返回日期。但是,如果您想使用sapply()
强制日期,则可以将as.Date()
与正确的origin
一起使用来返回日期。日期和功能示例:
dates <- c("October 21 2012", "Sep 22 2019")
guess_date <- function(x) {
# just for test purposes: try to coerce 2 different date formats
if (is.na(as.Date(x, "%b %d %Y"))) {
# format mmm dd yyyy
return(as.Date(x, "%b %d %Y"))
} else {
# format mmmm dd yyyy
return(as.Date(x, "%B %d %Y"))
}
}
因此guess_date()
将始终返回类Date
。但是现在用sapply()
进行检查:
sapply(dates, guess_date)
#> October 21 2012 Sep 22 2019
#> 15634 18161
以及您要查找的内容:
as.Date(sapply(dates, guess_date), origin = "1970-01-01")
#> October 21 2012 Sep 22 2019
#> "2012-10-21" "2019-09-22"