Как мне суммировать данные на основе дат? - PullRequest
0 голосов
/ 13 февраля 2019

Я использую R 3.5.0 в Windows 10.

У меня есть фрейм данных, который импортируется с использованием library(openxls) read.xls("....").Он имеет 100 000 строк, и часть его выглядит как

S.No Start.DateEnd.Date  Generation    unitout     timediff
7850   42907.76 42907.77 436.158469    INSERVICE       15
7851   42907.77 42907.78 443.302793    INSERVICE       15
7852   42907.78 42907.79 437.728683    INSERVICE       15
7853   42907.79 42907.80 390.832887    INSERVICE       15
7854   42907.80 42907.81 338.917658    INSERVICE       15
7855   42907.81 42907.82 300.056018    INSERVICE       15
7856   42907.82 42907.83 266.430064    INSERVICE       15
7857   42907.83 42907.84 248.952525    INSERVICE       15
7858   42907.84 42907.85 212.913333    INSERVICE       15
7859   42907.85 42907.86  18.523060    INSERVICE       15
7860   42907.86 42907.88   1.355428 OUTOFSERVICE       15
7861   42907.88 42907.89   1.355428 OUTOFSERVICE       15
7862   42907.89 42907.90   1.355428 OUTOFSERVICE       15
7863   42907.90 42907.91   1.355428 OUTOFSERVICE       15
7864   42907.91 42907.92   1.355428 OUTOFSERVICE       15
7865   42907.92 42907.93   1.355428 OUTOFSERVICE       15
7866   42907.93 42907.94   1.355428 OUTOFSERVICE       15
7867   42907.94 42907.95   1.355428 OUTOFSERVICE       15
7868   42907.95 42907.96   1.355428 OUTOFSERVICE       15
7869   42907.96 42907.97   1.355428 OUTOFSERVICE       15
7870   42907.97 42907.98   1.355428 OUTOFSERVICE       15

. Я хотел бы обобщить это, чтобы дать мне фрейм данных в форме

1 DateTime1(42907.76) DateTime2(42907.86) INSERVICE      TIMEDIFF
2 DateTime2(42907.86) DateTime3(42907.98) OUTOFSERVICE   TIMEDIFF
3 DateTime3(42907.98) DateTime4(...)      INSERVICE      TIMEDIFF

, где каждый раз, когда статус изменяетсяОБСЛУЖИВАНИЕ НА АУТОФСЕРВИСе фиксирует дату начала и дату окончания.В основном, я хочу знать, с какой даты + время, до какой даты + время было в обслуживании и вне обслуживания суммировано в кадре данных.В приведенном выше примере DateTime1 будет 42907.76, а DateTime2 будет 42907.86, поскольку после этого он выходит из строя.Точно так же DateTime2 будет 42907.86 - 42907.98.Так на ..

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

PS Дополнительная проблема - преобразование формата Excel Time в стандартный формат% Y% m% D% H% M.Я прочитал несколько потоков на SO, и я попытался сделать as.posixCT, as.date и т. Д., Но либо он меняется на NA, либо выдает ошибку.

1 Ответ

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

с использованием dplyr

Мы создаем задержку в единицах и используем ее для создания идентификатора, по которому мы можем впоследствии сгруппировать

library(dplyr)
df$id <- cumsum(as.integer(df$unitout != lag(df$unitout, n = 1, default=1))) 
df %>% group_by(id, unitout) %>% summarise("Start" = min(Start.Date), "End" = max(End.Date))

Вы можете преобразовать даты следующим образом:

  • Windows Excel: as.Date(42907.76, origin = "1899-12-30")
  • Mac Excel: as.Date(42907.76, origin = "1904-01-01")

данные :

df <- read_table(
"S.No Start.Date  End.Date  Generation  unitout       timediff
7850   42907.76   42907.77  436.158469  INSERVICE     15
7851   42907.77   42907.78  443.302793  INSERVICE     15
7852   42907.78   42907.79  437.728683  INSERVICE     15
7853   42907.79   42907.80  390.832887  INSERVICE     15
7854   42907.80   42907.81  338.917658  INSERVICE     15
7855   42907.81   42907.82  300.056018  INSERVICE     15
7856   42907.82   42907.83  266.430064  INSERVICE     15
7857   42907.83   42907.84  248.952525  INSERVICE     15
7858   42907.84   42907.85  212.913333  INSERVICE     15
7859   42907.85   42907.86  18.523060   INSERVICE     15
7860   42907.86   42907.88  1.355428    OUTOFSERVICE  15
7861   42907.88   42907.89  1.355428    OUTOFSERVICE  15
7862   42907.89   42907.90  1.355428    OUTOFSERVICE  15
7863   42907.90   42907.91  1.355428    OUTOFSERVICE  15
7864   42907.91   42907.92  1.355428    OUTOFSERVICE  15
7865   42907.92   42907.93  1.355428    OUTOFSERVICE  15
7866   42907.93   42907.94  1.355428    OUTOFSERVICE  15
7867   42907.94   42907.95  1.355428    OUTOFSERVICE  15
7868   42907.95   42907.96  1.355428    OUTOFSERVICE  15
7869   42907.96   42907.97  1.355428    OUTOFSERVICE  15
7870   42907.97   42907.98  1.355428    OUTOFSERVICE  15")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...