R преобразование даты и времени-lapply и unlist преобразуется в дни после эпохи
Я преобразую строку для дат, которые выглядят как 12/8/12, вероятно, довольно окольным путем путем 1) добавления ведущих нулей (Zero padding) к числам дня и месяца, а затем преобразования в объект даты с помощью функции 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
Я предполагаю, что базовое представление даты-дни с момента эпохи (следовательно, typeof возвращает double, но почему значение списка показывает даты, отформатированные в более удобочитаемой форме, а затем вызов unlist заставляет их вернуться к этим дням с момента формы эпохи?
Кроме того, есть ли элегантный способ для меня сделать такое преобразование? Может быть, мне не стоит использовать Лапли?
2 ответов:
Есть еще одно решение с пакетом
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"Функция
lubridatemdy()преобразует строки в объектеtestв месяц (m), дни (d) и годы (y). Если ваш объектtestявляется списком, то тот же ответ, что и у айчао, возможен с помощьюlubridate::mdy((unlist(test)).
Вам не нужна ваша функция
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")).
Comments