Данные
library(data.table)
SightingTime_chr = c("2017-07-31 09:56:27 UTC", "2017-07-31 10:36:30 UTC", "2017-08-01 00:07:20 UTC","2017-08-01 01:31:00 UTC", "2017-08-01 10:38:23 UTC", "2017-08-01 21:13:06 UTC", "2017-08-02 15:13:30 UTC", "2017-08-02 18:05:28 UTC", "2017-08-02 21:04:08 UTC")
x = data.table(SightingTime_chr)
код
Несколько вещей были не совсем верны с вашим преобразованием в datetime (формат, например):
x$SightingTime = as.POSIXct(x$SightingTime_chr, format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
attributes(x$SightingTime)$tzone <- "America/Halifax"
Сначала я преобразовал бы строки символов в POSIXct
, а затем преобразовал в часовой пояс Америки / Галифакса, поскольку первоначальный вектор, похоже, находится в дате и времени UTC (пропустите второй шаг, если я # m ошибаюсь).
x$TOD <- format(x$SightingTime, format="%H%M%S")
x$daynight = with(x, ifelse(TOD > "053000" & TOD < "200000", "Day", "Night"))
Я конвертирую время дня в псевдочисленное значение (значения не являются технически правильными, но этого должно быть достаточно для сравнения).
x$daynight
[1] "Day" "Day" "Night" "Night" "Day" "Day" "Day" "Day" "Day"
Теперь результаты отображаются правильно.
Альтернативный
Из этого ответа мы можем получить элегантное решение, если мы хотим больше, чем просто ночь / день:
nightday <- function(datetime) {
paste(
c("Night", "Morning", "Afternoon", "Evening", "Night")[
cut(as.numeric(format(datetime, "%H%M")), c(0, 530, 1100, 1700 ,2000, 2359))
]
)
}
nightday(x$SightingTime)
[1] "Morning" "Morning" "Night" "Night" "Morning" "Evening" "Afternoon" "Afternoon" "Evening"