如何根据日期汇总数据框?

时间:2019-02-13 09:21:49

标签: r date

我在Windows 10上使用R 3.5.0。

我有一个数据框,使用 library(openxls) read.xls("....")。它有10万行,部分看起来像

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

状态每次从INSERVICE变为OUTOFSERVICE时,都会捕获开始日期和结束日期。 基本上,我想知道数据帧中从哪个日期和时间开始服务到哪个日期和时间停止服务。在上面的示例中,DateTime1将为42907.76,DateTime2将为42907.86,因为在此之后它将不再使用。同样,DateTime2为42907.86至42907.98。等等。

我尝试创建一个标志来解决它,但是我无法创建数据框,因此没有在此处附加代码。与使用在后端执行所有操作的程序包相比,我更喜欢使用具有良好逻辑的易于理解的解决方案。

P.S。另一个问题是Excel时间格式转换为标准%Y%m%D%H%M格式。我已经在SO上读取了多个线程,并尝试执行as.posixCT,as.date等。但是它更改为NA或引发错误。

1 个答案:

答案 0 :(得分:0)

使用dplyr

我们创建一个unitout滞后,并使用它来创建一个ID,之后我们可以在该ID上进行分组

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")