我在Windows 10上使用R3.5.0。
我有一个使用library(openxls) read.xls("....")导入的dataframe。它有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时,它都会捕获开始日期和结束日期。基本上,我想知道在数据框架中它是从哪个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,要么抛出一个错误。
发布于 2019-02-13 10:05:41
使用dplyr
我们创建一个单元延迟,并使用它创建一个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))您可以通过以下方式转换您的日期:
as.Date(42907.76, origin = "1899-12-30")as.Date(42907.76, origin = "1904-01-01")data:
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")https://stackoverflow.com/questions/54666530
复制相似问题