Пометка групп последовательных часов на несколько дней - PullRequest
0 голосов
/ 15 июня 2019

В R я смотрю данные, которые показывают смоделированные сбои энергосистемы и нуждаются в способе помечать непрерывные сбои. Данные являются почасовыми, поэтому я ищу что-то, что может распознать последовательные часы, а затем разрывы в последовательности. У меня проблемы с маркировкой отключений, которые растягиваются на полночь.

Я пробовал пару подходов, но продолжаю сталкиваться с проблемами с перебоями, которые продолжаются несколько дней. Например, я могу пометить 12-часовой перерыв в работе, который длится с 8 до 20 часов, но он разделяет тег, если перерыв происходит, скажем, с 20 часа в день 1 до 12 в день 2 (в конечном итоге они выглядят как 2 разные, короче, простои).

month day hour outage_tag
1      2   23   1
1      2   24   1
1      3   1    1
1      3   2    1
3      5   13   2
3      5   14   2
3      5   15   2

Цель - создать столбец outage_tag, показанный выше. У меня возникают проблемы при создании тегов, которые переносятся около полуночи (тег 1 в примере будет разбит на 2 разных тега, что бесполезно). У меня есть данные для создания даты год-месяц-день-час, если необходимо.

Любая помощь (или предложения по улучшению этого вопроса) будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 15 июня 2019

Если перерывы могут продолжаться с февраля по март, тогда нам также нужно будет знать год, поэтому при условии, что year хранит год, преобразованный в POSIXct с использованием ISOdatetime, принимает последовательные различия, сравнивает их с 1 часом и накопительнымсумма.

year <- 2000
transform(DF, outage_tag = 
  cumsum(c(1, diff(ISOdatetime(year, month, day, hour-1, 0, 0, tz = "GMT")) != 1)))

подача:

  month day hour outage_tag
1     1   2   23          1
2     1   2   24          1
3     1   3    1          1
4     1   3    2          1
5     3   5   13          2
6     3   5   14          2
7     3   5   15          2

Примечание

DF <- structure(list(month = c(1L, 1L, 1L, 1L, 3L, 3L, 3L), day = c(2L, 
 2L, 3L, 3L, 5L, 5L, 5L), hour = c(23L, 24L, 1L, 2L, 13L, 14L, 
 15L)), class = "data.frame", 
 row.names = c(NA, -7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...