У меня несколько столбцов даты и времени, и мне нужно проверить, какие из них находятся в часовом поясе CEST

dat <- structure(c(1491199401.363, 1491201912.62, 1491205392.67, 1491205933.457, 1491206198.027, 1491206802.243), class = c("POSIXct", "POSIXt"), tzone = "")
dat
#[1] "2017-04-03 08:03:21 CEST" "2017-04-03 08:45:12 CEST" [3]
#"2017-04-03 09:43:12 CEST" "2017-04-03 09:52:13 CEST" [5] "2017-04-03
#09:56:38 CEST" "2017-04-03 10:06:42 CEST"

any(grep("CEST", dat))
#[1] FALSE
any(grep("CEST", "2017-04-03 08:03:21 CEST"))
#[1] TRUE

Я могу заставить этот метод работать, если я скопирую / вставлю элементы в функцию grep, но не если я запустил его в самом векторе. Использование as.character(dat) тоже не работает. Как мне это сделать?

1
Acarbalacar 14 Ноя 2017 в 12:18

1 ответ

Лучший ответ

Мы можем извлечь часовой пояс с помощью format и использовать %in%, чтобы получить

"CEST" %in% format(dat, format="%Z")
#[1] TRUE

Или другой вариант - unclass после преобразования в POSIXlt и извлечь zone

"CEST" %in% unclass(as.POSIXlt(dat))$zone
#[1] TRUE

В единственном элементе, который OP отправлял grep, это класс character, а dat - это класс POSIXct. Таким образом, он сможет найти подстроку с помощью grep. Даже если мы конвертируем 'dat' в character, он потеряет атрибуты, т.е.

as.character(dat)
#[1] "2017-04-03 08:03:21" "2017-04-03 08:45:12" "2017-04-03 09:43:12" "2017-04-03 09:52:13" "2017-04-03 09:56:38" "2017-04-03 10:06:42"

И поэтому grep не сможет его выбрать

grepl("CEST", as.character(dat))
#[1] FALSE FALSE FALSE FALSE FALSE FALSE
0
akrun 14 Ноя 2017 в 09:34