Категоризация временных интервалов до дат в R - PullRequest
0 голосов
/ 10 февраля 2019

У меня очень большой набор данных, в котором мне нужно разбить временные интервалы на даты для дальнейшего анализа.

Ниже приведен пример моего набора данных:

require(data.table)

RawDT = data.table(
   TimeStampID = c("4"),
  DateTimeFrom = c("2019-02-10 16:28:03"),
    DateTimeTo = c("2019-02-12 02:04:03")
)

Ниже приведен желаемый результат:

ResultDT = data.table(
           ID = c("1","2","3"),
  TimeStampID = c("4","4","4"),
           DS = c("2019-02-10","2019-02-11","2019-02-12"),
     TimeFrom = c("16:28:03","00:00:00","00:00:00"),
       TimeTo = c("23:59:59","23:59:59","02:04:03")
)

Может ли кто-нибудь подсказать мне, какую функцию использовать для достижения ResultDT изRawDT

1 Ответ

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

ОК, это пограничный дубликат, поэтому я рекомендую модераторам закрыть тему, если они сочтут это целесообразным, и я удалю свой пост.

Однако у меня было похожее (ноне совсем идентичны, поэтому я отвечаю) проблема с началом и концом года ( здесь ), и @Jaap создал отличное (и сжатое!) решение, логика которого может быть применена и здесь,например:

library(data.table)

RawDT[, `:=` (DateTimeFrom = as.POSIXct(DateTimeFrom), DateTimeTo = as.POSIXct(DateTimeTo))]

RawDT[RawDT[, rep(.I, 1 + as.Date(DateTimeTo) - as.Date(DateTimeFrom))]
   ][, `:=` (DateTimeFrom = pmax(DateTimeFrom[1], as.POSIXct(paste0(as.Date(DateTimeFrom[1]) + 0:(.N-1), ' 00:00:00'))),
             DateTimeTo = pmin(DateTimeTo[.N], as.POSIXct(paste0(as.Date(DateTimeTo[.N]) - (.N-1):0, ' 23:59:59'))))
     , by = .(TimeStampID, rleid(DateTimeFrom))][]

Я добавил дополнительную группу к вашему DT только для проверки функциональности:

RawDT = data.table(
  TimeStampID = c("4", "5"),
  DateTimeFrom = c("2019-02-10 16:28:03", "2019-03-15 12:28:03"),
  DateTimeTo = c("2019-02-12 02:04:03", "2019-03-20 14:45:00")
)

И вывод для приведенного выше кода будет:

   TimeStampID        DateTimeFrom          DateTimeTo
1:           4 2019-02-10 16:28:03 2019-02-10 23:59:59
2:           4 2019-02-11 00:00:00 2019-02-11 23:59:59
3:           4 2019-02-12 00:00:00 2019-02-12 02:04:03
4:           5 2019-03-15 12:28:03 2019-03-15 23:59:59
5:           5 2019-03-16 00:00:00 2019-03-16 23:59:59
6:           5 2019-03-17 00:00:00 2019-03-17 23:59:59
7:           5 2019-03-18 00:00:00 2019-03-18 23:59:59
8:           5 2019-03-19 00:00:00 2019-03-19 23:59:59
9:           5 2019-03-20 00:00:00 2019-03-20 14:45:00
...