Использование which () в объекте POSIXct захватывает неправильные элементы

У меня есть фрейм данных e, в котором есть столбец даты. В исходном файле даты сохраняются как коэффициенты. Поэтому я преобразовываю их в символьные строки. В этих строках они имеют формат День / Месяц / Год Час: Минута, например 27.05.2014 15:42. Затем я использую strptime для преобразования этих строк в объекты POSIXct.

e$Date = as.character(e$Date)
e$Date = strptime(e$Date, tz = "UTC",  format = "%d/%m/%Y %H:%M")

Все выглядит хорошо на выходе, потому что даты теперь имеют форму «2014-05-27 15:42:00 UTC». Тем не мение. Когда я использую which () для поиска дат после "2016-02-14 00:51:00 UTC", я получаю неправильные даты!

 which(e$Date>"2016-02-14 00:51:00 UTC")

Команда возвращает список дат, которые начинаются с «2016-02-12 08:54:00 UTC», хотя есть несколько десятков дат после моей начальной точки, но до «2016-02-12 08:54:00 UTC» что в него не входит. Кажется, сдвигается вперед на 8 или 9 часов.

Я знаю, что что-то не так с часовыми поясами. Я видел ответ на Subset dataframe на основе даты и времени POSIXct больше, чем datetime, с использованием dplyr, который казался очень близким к моей проблеме. Тем не менее, я указал часовой пояс в моей исходной команде strptime (я также пробовал использовать as.POSIXct вместо strptime и имел ту же проблему).
Может ли кто-нибудь увидеть, что я делаю неправильно ???


person confused_coder    schedule 29.08.2018    source источник


Ответы (1)


Вероятно, вам следует сохранить его как POSIXlt datetime (который strptime создает), а затем сравнить с другим объектом datetime в соответствующем часовом поясе. Например.:

x <- strptime(c("2018-08-30 08:04", "2018-08-30 08:05", "2018-08-30 08:06", 
"2018-08-30 08:07", "2018-08-30 08:08"), format="%Y-%m-%d %H:%M", tz="UTC")
#[1] "2018-08-30 08:04:00 UTC" "2018-08-30 08:05:00 UTC"
#[3] "2018-08-30 08:06:00 UTC" "2018-08-30 08:07:00 UTC"
#[5] "2018-08-30 08:08:00 UTC"

Текстовое сравнение дает странные результаты:

x > "2018-08-30 08:06:00 UTC"
#TRUE TRUE TRUE TRUE TRUE

Сравнение даты и времени:

x > as.POSIXlt("2018-08-30 08:06:00", tz="UTC")
#[1] FALSE FALSE FALSE  TRUE  TRUE
person thelatemail    schedule 29.08.2018