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 заставляет их вернуться к этим дням с момента формы эпохи?



Кроме того, есть ли элегантный способ для меня сделать такое преобразование? Может быть, мне не стоит использовать Лапли?

418   2  
r

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"

Функция lubridate mdy() преобразует строки в объекте 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

    Ничего не найдено.