2016-09-26 69 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"))。