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