我正在转换一个字符串,其日期看起来像12/8/12
,可能是以相当迂回的方式1)将前导零(零填充)添加到日期和月份数字,然后使用{转换为日期对象{1}}函数在我写的自定义函数中。
as.Date
令我感到非常困惑的是,当我在一个输入上调用该函数时,我可以取回我想要的结果:
date_conversion <- function(date_string){
split <- unlist(strsplit(date_string, "/"))
split[1] = str_pad(split[1], 2, pad = "0")
split[2] = str_pad(split[1], 2, pad = "0")
t = as.Date(paste(split, collapse = "/"),format='%m/%d/%y')
return (t)
}
然后当我使用> date_conversion(test[1])
[1] "2012-12-12"
> typeof(date_conversion(test[1]))
[1] "double"
时,它返回此字符串表示形式:
lapply
然后,当我致电 > lapply(test, date_conversion)
[[1]]
[1] "2012-12-12"
[[2]]
[1] "2015-12-12"
[[3]]
[1] "2015-09-09"
时,日期会更改为自纪元以来的天数:
unlist
我想日期的基础表示是自纪元以来的几天(因此 unlist(lapply(test, date_conversion))
[1] 15686 16781 16687
返回double,但为什么列表值会以更易读的形式显示格式,然后调用typeof
make自从时代形成以来,它们又回到了今天?
另外,有一种优雅的方式让我进行这样的转换吗?也许我不应该使用Lapply?
答案 0 :(得分:3)
lubridate
包有另一个解决方案:
test <- c("12/8/12", "1/1/13", "2/4/13")
dates <- lubridate::mdy(test)
##[1] "2012-12-08" "2013-01-01" "2013-02-04"
class(dates)
##Date[1:3], format: "2012-12-08" "2013-01-01" "2013-02-04"
str(dates)
##[1] "Date"
lubridate
函数mdy()
将对象test
中的字符串转换为月(m),天(d)和年(y)。
如果您的对象test
是一个列表,则可以使用lubridate::mdy((unlist(test))
与aichao所写的答案相同。
答案 1 :(得分:1)
您不需要date_conversion
功能,因为as.Date
将使用日期字符串的格式,并且它是矢量化的。因此,如果test
是您日期的字符串向量:
test <- c("12/8/12", "1/1/13", "2/4/13")
print(result)
result <- as.Date(test, format="%m/%d/%y")
##[1] "2012-12-08" "2013-01-01" "2013-02-04"
str(result)
##Date[1:3], format: "2012-12-08" "2013-01-01" "2013-02-04"
class(result)
##[1] "Date"
如果test
是list
,那么首先unlist
(即as.Date(unlist(test), format="%m/%d/%y")
)。