2016-09-26 68 views
2

我正在转换字符串的日期看起来像12/8/12,可能是一个相当迂回的方式1)添加前导零(零填充)的一天和然后使用我编写的自定义函数中的as.Date函数转换为日期对象。R日期时间转换 - lapply和unlist转换为时代后的天

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 

我想日期的底层表示日以来的时代(因此typeof收益加倍,但为什么会在列表值显示的日期格式更人类可读的形式,然后调用unlist让他们去回这一天以来的时代形式?

此外,有没有一种优雅的方式来做这样的转换?也许我不应该使用Lapply?

回答

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是一个列表,与aichao所写的答案相同,可以使用lubridate::mdy((unlist(test))

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" 

如果testlist,然后unlist第一(即as.Date(unlist(test), format="%m/%d/%y"))。