Я считаю, что подобные вопросы задавались несколько раз раньше.Однако есть один важный момент, который требует особого внимания:
Что такое origin
для дат, заданных как целое число (или как символьная строка, которая может быть преобразована в целое число, чтобы быть точным)?
Если данные импортированы из версии Excel для Windows, необходимо использовать origin = "1899-12-30"
.Подробности см. В разделе Пример в help(as.Date)
и в разделе «Другие приложения» статьи Справочной службы R Габора Гротендика и Томаса Петцольдта .
.строки даты и времени, используется функция mdy_hms()
из пакета lubridate
.Кроме того, я использую синтаксис data.table
для краткости:
library(data.table)
data.table(dates)[!dates %like% "^\\d+$", new_date := as.Date(lubridate::mdy_hms(dates))][
is.na(new_date), new_date := as.Date(as.integer(dates), origin = "1899-12-30")][]
dates new_date
1: Fri May 18 2018 00:00:00 GMT-0700 (PDT) 2018-05-18
2: 43203 2018-04-13
3: Wed Apr 25 2018 00:00:00 GMT-0700 (Pacific Standard Time) 2018-04-25
4: 43167 2018-03-08
5: 43201 2018-04-11
6: Fri May 18 2018 00:00:00 GMT-0700 (PDT) 2018-05-18
7: Tue May 29 2018 00:00:00 GMT-0700 (Pacific Standard Time) 2018-05-29
8: Tue May 01 2018 00:00:00 GMT-0700 (PDT) 2018-05-01
9: Fri May 25 2018 00:00:00 GMT-0700 (Pacific Standard Time) 2018-05-25
10: Fri Apr 06 2018 00:00:00 GMT-0700 (PDT) 2018-04-06
11: 43173 2018-03-14
Очевидно, предположение о выборе источника, принадлежащего версии Excel для Windows, кажетсяHold.
Если требуется только вектор значений Date
:
data.table(dates)[!dates %like% "^\\d+$", new_date := as.Date(lubridate::mdy_hms(dates))][
is.na(new_date), new_date := as.Date(as.integer(dates), origin = "1899-12-30")][, new_date]
[1] "2018-05-18" "2018-04-13" "2018-04-25" "2018-03-08" "2018-04-11" "2018-05-18"
[7] "2018-05-29" "2018-05-01" "2018-05-25" "2018-04-06" "2018-03-14"