首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据日期总结数据?

如何根据日期总结数据?
EN

Stack Overflow用户
提问于 2019-02-13 09:21:49
回答 1查看 50关注 0票数 0

我在Windows 10上使用R3.5.0。

我有一个使用library(openxls) read.xls("....")导入的dataframe。它有10万个行,其中一部分看起来

代码语言:javascript
复制
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

我想总结一下,给我一份表格的数据

代码语言:javascript
复制
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时,它都会捕获开始日期和结束日期。基本上,我想知道在数据框架中它是从哪个date+time中向哪个date+time提供服务和退出服务的。在上面的例子中,DateTime1是42907.76,DateTime2是42907.86,因为在那之后它就停止服务了。同样,DateTime2为42907.86到42907.98,依此类推。

我尝试过创建一个标志来解决这个问题,但是我无法创建数据框架,所以我没有在这里附加代码。我倾向于使用一种易于理解的解决方案,并具有良好的逻辑,而不是使用在后端执行所有操作的包。

另一个问题是将Excel时间格式转换为标准%Y%m%D%H%M格式。我在SO上读取了多个线程,我尝试过执行as.posixCT、as.date等操作,但是要么它更改为NA,要么抛出一个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-13 10:05:41

使用dplyr

我们创建一个单元延迟,并使用它创建一个ID,然后我们可以对其进行分组。

代码语言:javascript
复制
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:as.Date(42907.76, origin = "1899-12-30")
  • Mac:as.Date(42907.76, origin = "1904-01-01")

data

代码语言:javascript
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54666530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档