Почему некоторые значения даты и времени удаляются, когда я округляю время в 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")
Другие вопросы по тегам