Почему некоторые значения даты и времени удаляются, когда я округляю время в R?
Я импортирую серию CSV-файлов в R. Они содержат столбец даты / времени, id и два столбца значений температуры.
Это даст пример того, как выглядят данные:
id<-c(1,2,3,4)
date.time<-as.character(c("12/03/17 00:21:28", "12/03/17 02:21:28", "12/03/17 04:21:28", "12/03/17 06:21:28"))
temp1<-c(-3.568,-3.568,-3.598,-3.598)
temp2<-c(-11.577,-11.577,-11.541,-11.433)
df<-data.frame(id,date.time,temp1,temp2)
Поскольку дата / время не в нужном мне формате, я использовал strptime и форматировал их как POSIXlt.
Подобно:
df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
Это прекрасно работает и дает данные, которые выглядят так:
id date.time temp1 temp2
1 2017-03-12 0:21:28 -3.568 -11.577
2 2017-03-12 2:21:28 -3.568 -11.577
3 2017-03-12 4:21:28 -3.598 -11.541
4 2017-03-12 6:21:28 -3.598 -11.433
Однако затем я хочу округлить часть времени столбца date.time до ближайшего часа. Я использовал:
df$date.time<-round(df$date.time, units="hours")
Это прекрасно работает в 99% случаев. Однако в некоторых файлах R удаляет значения date.time, по-видимому, случайным образом и дает NA. Удаляется только одно или два значения в каждом файле, и я не вижу причин, по которым эти конкретные значения будут удалены. Например:
id date.time temp1 temp2
1 2017-03-12 0:00:00 -3.568 -11.577
2 NA -3.568 -11.577
3 2017-03-12 4:00:00 -3.598 -11.541
4 2017-03-12 6:00:00 -3.598 -11.433
Из того, что я прочитал, значения даты / времени могут быть привередливыми, но это кажется странно случайным.
Кто-нибудь знает, что может быть причиной этой проблемы и есть ли лучший способ округлить временную часть значений POSIXlt?
Обновление: кажется, единственное время, которое удаляется, это в 2 часа ночи 12 марта. Таким образом, многие времена, которые должны быть округлены до 2017-03-12 02:00:00, заменяются на NA. Но это не происходит со всеми файлами CSV, только около половины. Почему у R возникают проблемы с чтением этой конкретной даты?
Спасибо!
2 ответа
Не добавляя часовой пояс для strptime
портит вашу строку.
Давайте посмотрим на head
из df$date.time
, Отсутствующие / разные часовые пояса.
head(df$date.time)
[1] "2017-03-12 00:21:28 PST"
[2] "2017-03-12 02:21:28"
[3] "2017-03-12 04:21:28 PDT"
[4] "2017-03-12 06:21:28 PDT"
Добавляя tz="GMT0"
на ваш strptime
Функция вы должны получить желаемый результат.
df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S", tz="GMT0")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
df$date.time<-round(df$date.time, units="hours")
> head(df$date.time)
[1] "2017-03-12 00:00:00 GMT"
[2] "2017-03-12 02:00:00 GMT"
[3] "2017-03-12 04:00:00 GMT"
[4] "2017-03-12 06:00:00 GMT"
Мой любимый способ преобразования дат из строк - это lubridate
пакет. Вы могли бы заменить свой strtime
а также as.POSIXlt
линии с
library(lubridate)
df$date.time = dmy_hms(df$date.time)
и округлите его до таких часов:
df$date = round_date(df$date.time, "hour")