Преобразовать числовой Excel в дату

У меня есть вектор числовых дат Excel, т.е.

date <- c(42963,42994,42903,42933,42964)

Я ожидаю вывод при использовании excel_to_numeric_date функция от janitor пакет и as.yearmon функция от zoo пакет

as.yearmon(excel_numeric_to_date(date)) [1] "Aug 2016" "Sep 2016" "Jun 2017" "Jul 2017" "Aug 2017",

Однако преобразование первого в элементы date вектор неверен. Фактический результат:

as.yearmon(excel_numeric_to_date(date)) [1] "Aug 2017" "Sep 2017" "Jun 2017" "Jul 2017" "Aug 2017"

Я пробовал использовать другой вариант (modern а также mac pre-2011) для date_system аргумент в excel_numeric_to_date но это тоже не помогает

Версия Excel 2010

3 ответа

Вы можете просто использовать as.Date и указать происхождение, т.е.

as.Date(date, origin="1899-12-30") 
#[1] "2017-08-16" "2017-09-16" "2017-06-17" "2017-07-17" "2017-08-17"

#or format it to your liking,

format(as.Date(date, origin="1899-12-30"), '%b %Y') 
#[1] "Aug 2017" "Sep 2017" "Jun 2017" "Jul 2017" "Aug 2017"

Эта ссылка дает довольно мало информации по этому вопросу.

Если вы хотите конвертировать даты из Excel, вы можете использовать as.Date() с конкретным origin, Согласно документации, '1900-01-01' используется как день `в Excel.

date <- c(42963,42994,42903,42933,42964)

Это результат as.Date():

as.Date(date, origin = "1900-01-01")
[1] "2017-08-18" "2017-09-18" "2017-06-19" "2017-07-19" "2017-08-19"

Затем вы можете использовать zoo::as.yearmon()`, чтобы получить ожидаемый результат:

zoo::as.yearmon(as.Date(date, origin = "1900-01-01"))
[1] "Aug 2017" "Sep 2017" "Jun 2017" "Jul 2017" "Aug 2017"

Тип excel_numeric_to_date взглянем на код функции, и вы увидите, что это оболочка для строки кода, используемой другими ответами на этот вопрос: as.Date(date_num, origin = "1899-12-30",

Так что это не проблема.

Основной вопрос здесь - путаница с форматированием даты. Вы говорите, что ожидаете свой первый номер 42963 становиться "Aug 2016"и ваш последний номер 42964 становиться "Aug 2017", Последний является лишь на один больше, чем первый, который обнаруживается в конверсии - они должны быть на расстоянии одного дня, а не на год, как вы ожидаете:

> excel_numeric_to_date(c(42963, 42964))
[1] "2017-08-16" "2017-08-17" # as expected, they are one day apart

Возможно, в ваших данных поля дня и года переключаются вверх по течению в точке, где они сопоставляются с целочисленными датами, и здесь было трудно сказать это из-за выбранных значений.

Другие вопросы по тегам