Конвертировать дату с форматами часовых поясов в R - PullRequest
0 голосов
/ 05 июня 2018

У меня есть даты в следующем формате: - Wed Apr 25 2018 00:00:00 GMT-0700 (Pacific Standard Time) или 43167 или Fri May 18 2018 00:00:00 GMT-0700 (PDT) все смешано в 1 столбце.Что было бы самым простым способом преобразовать все это в простой YYYY-mm-dd (2018-04-13) формат?Вот столбец:

dates <- c('Fri May 18 2018 00:00:00 GMT-0700 (PDT)',
'43203',
'Wed Apr 25 2018 00:00:00 GMT-0700 (Pacific Standard Time)',
'43167','43201',
'Fri May 18 2018 00:00:00 GMT-0700 (PDT)',
'Tue May 29 2018 00:00:00 GMT-0700 (Pacific Standard Time)',
'Tue May 01 2018 00:00:00 GMT-0700 (PDT)',
'Fri May 25 2018 00:00:00 GMT-0700 (Pacific Standard Time)',
'Fri Apr 06 2018 00:00:00 GMT-0700 (PDT)','43173')

Ожидаемый формат: 2018-05-18, 2018-04-13, 2018-04-25, ...

1 Ответ

0 голосов
/ 05 июня 2018

Я считаю, что подобные вопросы задавались несколько раз раньше.Однако есть один важный момент, который требует особого внимания:

Что такое 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"
...