【发布时间】:2015-07-17 08:43:36
【问题描述】:
我对 R 中的日期有疑问。
我有一些日期数据,但是格式不一致。根据一个月中的哪一天,它被存储为 dmmyyyy 或 ddmmyyyy。为了解决这个问题,我编写了一个小函数(见下文),它接受字符串、检查长度、重新格式化然后返回日期。我使用 sapply(dates, formatDate) 并且根据我的打印输出,一切都按预期工作。然而,结果向量不包含相同的值。
head(dates)
#> [1] 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)
}
【问题讨论】:
-
看起来您正在获取数值。要转换为日期,如果我理解您的问题,您可以使用
as.Date(yourreturnvector), origin='1970-01-01') -
太好了,感谢您的帮助!我曾尝试返回 as.Date(x),但我没有意识到我可以在整个向量上使用它。一个问题 - 我需要使用 origin 参数吗?
-
原因是
sapply可能会在长度相同的情况下将list更改为矩阵左右,并且日期将被强制转换为它存储的数值。最好使用lapply来避免这种情况 -
是的,您需要
origin参数 -
simplify = FALSE也可以阻止sapply以“折叠”结果。
标签: r