Проблемы с использованием foverlaps с объектами POSIXct - возможно, из-за доли секунды? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть 2 таблицы данных, и я хотел бы найти строки, которые перекрываются, используя foverlaps.Я думаю, что меня сбивают с толку, потому что у некоторых дат есть доли секунды.

library(data.table)

Сначала создайте таблицу данных времен смены

On <- as.POSIXct(c("2017-08-01 00:05:54", "2017-08-01 00:07:20", "2017-08-01 00:21:53"),  format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
Off <- as.POSIXct(c("2017-08-01 00:05:54", "2017-08-01 00:07:20", "2017-08-01 00:21:53"),  format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
shifts <- data.table(On, Off)

Теперь создайте таблицу данных времен наблюдений. Первая группа наблюдений получена из Matlab, поэтому ее необходимо преобразовать вPOSIXct первым.В итоге они дают мне доли секунды

timestamp <- c(736908.0041, 736908.0051, 736908.009, 736908.012, 736908.0152)
Obs = data.table(SightingTime = as.POSIXct((timestamp-719529)*86400, origin = "1970-01-01", tz = "UTC"))
#add a variable for the "date type"
Obs$DateType = "Long"

Добавить строку в таблицу данных, которая не имеет доли секунды (для целей данного примера)

Obs <- rbind(Obs, data.table(SightingTime=as.POSIXct("2017-08-01 00:05:54",  format = "%Y-%m-%d %H:%M:%S", tz = "UTC"), DateType = "Short"))

создать интервалы между точками, чтобыможно использовать foverlaps

Obs[, SightingTime2 := SightingTime]

подготовиться к foverlaps

setkey(Obs, SightingTime, SightingTime2)
setkey(shifts, On, Off)

сделать соединение перекрытия

Obs.ov <- foverlaps(shifts, Obs ,type="any",nomatch=0L)

В результате Obs.ov будет иметь одну строку -перекрывается с «коротким» форматом даты.Строки с длинным форматом даты не включаются в перекрытие.Я ожидал бы, что три строки будут перекрываться (предполагая, что дробные секунды будут округлены, я бы также ожидал перекрытия с метками времени 00:05:54 и 00:21:53 "Long".

Я думаю, что это может быть связано с долями секунды в датах, которые я конвертировал из Matlab, но я не знаю, как избавиться от дробного бита. Я попытался использовать

attributes(Obs$SightingTime)$format <- "%Y-%m-%d %H:%M:%OS"

, а также включитьаргумент "format", когда переменная SightingTime была создана из переменной "timestamp" на ранней стадии. Но мне не повезло ни с одним из них.

Я посмотрел здесь Как отформатировать дробные секунды в POSIXct в r, но не могу понять, какие изменения мне нужно сделать, основываясь на этом.

1 Ответ

0 голосов
/ 13 февраля 2019

Я нашел то, что мне было нужно здесь Удалите секунды из времени в R

Мне просто нужно было округлить секунды после создания переменной SightingTime, но до создания переменной "SightingTime2".

Obs$SightingTime <- as.POSIXct(round(Obs$SightingTime, units="secs")) 

Теперь, когда я делаю перекрытия, я получаю 3 перекрывающихся ряда, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...