Извлечение интервалов из временных данных в R

Моя проблема проста. У меня есть таблица, в которой каждая строка - это событие (указаны месяц, день, час, минута). Однако машина была настроена на круглосуточную запись. Так что у меня больше событий (строк), чем мне нужно. Как удалить лишние строки из дневного времени и оставить только строки из ночного времени (от заката до восхода солнца)? Ужасно то, что время восхода/заката немного отличается каждый день >.

В этом примере я предоставляю две таблицы. Первая таблица со всеми событиями, вторая содержит время заката/рассвета для каждого дня.

Если есть возможность извлечь, обратите внимание, что КАЖДАЯ ночь состоит из двух дат может быть в таблице с ID ночи вставлен дополнительный столбец? (см. схему ниже )

введите здесь описание изображения

# table with all events
my.table <- data.frame(event = 1:34,
                       day = rep(c(30,31,1,2,3), times = c(8,9,7,8,2)),
                       month = rep(c(3,4), each = 17),
                       hour = c(13,13,13,13,22,
                                22,23,23,2,2,2,
                                14,14,14,19,22,22,
                                2,2,2,14,15,22,22,
                                3,3,3,14,14,14,
                                23,23,2,14),
                       minute = c(11,13,44,55,27,
                                  32,54,57,10,14,
                                  26,12,16,46,30,
                                  12,13,14,16,45,
                                  12,15,12,15,24,
                                  26,28,12,16,23,12,13,11,11))


# timings of sunset/sunrise for each day
sun.table <- data.frame(day = c(30,31,31,1,1,2,2,3),
                        month = rep(c(3,4), times = c(3,5)),
                        hour = rep(c(19,6), times = 4),
                        minute = c(30,30,31,29,32,
                                   28,33,27),
                        type = rep(c("sunset","sunrise"), times = 4))

# rigth solution reduced table would contain only rows:
# 5,6,7,8,9,10,11,16,17,18,19,20,23,24,25,26,27,31,32,33.
# nrow("reduced table") == 20

person Ladislav Naďo    schedule 27.08.2014    source источник
comment
Должен ли my.table иметь столбец часов?   -  person Mike.Gahan    schedule 28.08.2014
comment
Должны ли также быть рассвет и закат для каждого дня в sun.table?   -  person Mike.Gahan    schedule 28.08.2014
comment
Ну, не обязательно. Машина начинает запись первого дня ближе к вечеру (в первый день только закат) и заканчивает запись также вечером (только восход солнца в последний день). Все дни в середине имеют время заката и восхода солнца. Если хотите, я могу добавить время, чтобы их всегда было два в день, или Зоу может просто подставить только дни с обоими значениями времени из таблиц выше. Не беда, если будут исключены несколько дней, если такая процедура упростит процесс добычи.   -  person Ladislav Naďo    schedule 28.08.2014
comment
В первый день восход солнца (29 число)   -  person Mike.Gahan    schedule 28.08.2014


Ответы (1)


Вот одна из возможных стратегий

#convert sun-up, sun-down times to proper dates
ss <- with(sun.table, ISOdate(2000,month,day,hour,minute))
up <- ss[seq(1,length(ss),by=2)]
down <- ss[seq(2,length(ss),by=2)]

Здесь я предполагаю, что таблица упорядочена и начинается с восходом солнца, чередуется туда и обратно и заканчивается закатом. Для значений даты также нужен год, здесь я просто жестко закодировал 2000. Если ваши данные не охватывают годы (или високосные дни), это должно быть хорошо, но вы, вероятно, захотите указать фактический год ваших наблюдений.

Теперь сделайте то же самое для событий

tt <- with(my.table, ISOdate(2000,month,day,hour,minute))

Поиск строк в течение дня

daytime <- sapply(tt, function(x) any(up<x & x<down))

и извлеките эти строки

my.table[daytime, ]

#    event day month hour minute
# 5      5  30     3   22     27
# 6      6  30     3   22     32
# 7      7  30     3   23     54
# 8      8  30     3   23     57
# 9      9  31     3    2     10
# 10    10  31     3    2     14
# 11    11  31     3    2     26
# 16    16  31     3   22     12
# 17    17  31     3   22     13
# 18    18   1     4    2     14
# 19    19   1     4    2     16
# 20    20   1     4    2     45
# 23    23   1     4   22     12
# 24    24   1     4   22     15
# 25    25   2     4    3     24
# 26    26   2     4    3     26
# 27    27   2     4    3     28
# 31    31   2     4   23     12
# 32    32   2     4   23     13
# 33    33   3     4    2     11

Здесь мы берем только значения после восхода и до захода солнца. Поскольку в sun.table недостаточно информации, чтобы убедиться, что строка 34 действительно появляется перед подмножеством, она не возвращается.

person MrFlick    schedule 28.08.2014
comment
Спасибо @MrFlick! Значения действительно странные - они полностью сфабрикованы. В моей исходной таблице более 100 000 строк, я попробую эту процедуру. А как быть с колонкой, указывающей ID ночи? - person Ladislav Naďo; 28.08.2014
comment
О, и для даты нужен год, поэтому здесь я просто жестко закодировал 2000 год. Вероятно, вам следует изменить это на фактический год ваших наблюдений. - person MrFlick; 28.08.2014
comment
Уважаемый @MrFlick. Я боюсь, что ваш ответ не подходит для моего вопроса. Я сделал несколько обновлений. Если вы все еще заинтересованы, пожалуйста, посмотрите на него. Я также установил награду. - person Ladislav Naďo; 31.08.2014
comment
@LadislavNado Я обновил свой ответ, чтобы он соответствовал вашему желаемому результату. Имея это в первый раз, было бы проще. - person MrFlick; 31.08.2014