R Start Column&结束列时间日志

时间:2018-04-09 16:36:45

标签: r

我有一个包含3列的数据表,(Start,Stop和& Type)。一些原始日期时间从“停止”到“开始”顺利切换,但其他日期则有差距。我想创建一个包含Start datetime,End datetime和&的新行。如果需要,键入= 0填补空白。以下是一些示例数据...

我有什么......

LOG_START_DT    LOG_END_DT      Type
3/28/2018 9:30  3/28/2018 12:15 2
3/28/2018 13:30 3/28/2018 16:30 1
3/28/2018 17:15 3/28/2018 20:00 2
3/28/2018 21:15 3/29/2018 0:00  2
3/29/2018 0:00  3/29/2018 0:30  2
3/29/2018 1:30  3/29/2018 5:00  1

我想要的......

LOG_START_DT    LOG_END_DT      Type
3/28/2018 9:30  3/28/2018 12:15 2
3/28/2018 12:16 3/28/2018 13:29 0
3/28/2018 13:30 3/28/2018 16:30 1
3/28/2018 16:31 3/28/2018 17:14 0
3/28/2018 17:15 3/28/2018 20:00 2
3/28/2018 20:01 3/28/2018 21:14 0
3/28/2018 21:15 3/29/2018 0:00  2
3/29/2018 0:00  3/29/2018 0:30  2
3/29/2018 0:31  3/29/2018 1:29  0
3/29/2018 1:30  3/29/2018 5:00  1

此外,重要的是要注意添加的行没有与前一个结束时间或下一个开始日期时间重叠的时间。我的原始数据大约也是500行,我试图对循环或if语句进行组合,但是无法弄清楚它或者需要花费太长时间才能运行数据。

谢谢!

1 个答案:

答案 0 :(得分:1)

让我们获取数据并转换为日期时间。

library(tidyverse)
library(lubridate)

foo <- read_table("LOG_START_DT    LOG_END_DT      Type
3/28/2018 9:30  3/28/2018 12:15 2
3/28/2018 13:30 3/28/2018 16:30 1
3/28/2018 17:15 3/28/2018 20:00 2
3/28/2018 21:15 3/29/2018 0:00  2
3/29/2018 0:00  3/29/2018 0:30  2
3/29/2018 1:30  3/29/2018 5:00  1")


foo <- foo %>% 
  mutate(LOG_START_DT = mdy_hm(LOG_START_DT), LOG_END_DT = mdy_hm(LOG_END_DT))

让我们创建一个辅助数据框,其末尾为开头,开头为结尾,所有Type0

bar <- data_frame(LOG_START_DT = foo$LOG_END_DT[-nrow(foo)],
                  LOG_END_DT = foo$LOG_START_DT[-1],
                  Type = 0L)
bar
#> # A tibble: 5 x 3
#>   LOG_START_DT        LOG_END_DT           Type
#>   <dttm>              <dttm>              <int>
#> 1 2018-03-28 12:15:00 2018-03-28 13:30:00     0
#> 2 2018-03-28 16:30:00 2018-03-28 17:15:00     0
#> 3 2018-03-28 20:00:00 2018-03-28 21:15:00     0
#> 4 2018-03-29 00:00:00 2018-03-29 00:00:00     0
#> 5 2018-03-29 00:30:00 2018-03-29 01:30:00     0

然后摆脱由&#34;顺利切换&#34;产生的任何行。 (你没有很好地定义,所以我将它定义为&#34;下一个开始与前一个结束相同&#34;)。之后,(这似乎不是一个好主意,但这可以为您提供所需的内容)添加一分钟并从两个日期时间列中减去一分钟。

bar <- bar %>% 
  filter(LOG_START_DT != LOG_END_DT) %>% 
  mutate(LOG_START_DT = LOG_START_DT + minutes(1),
     LOG_END_DT = LOG_END_DT - minutes(1))

我不认为调整是一个好主意,因为如果原始开始和结束恰好只相隔一分钟(或更短),它似乎会破坏。但这取决于你。

然后将两个数据框绑定在一起并对其进行排序。

baz <- rbind(foo, bar) %>% 
  arrange(LOG_START_DT)
baz
#> # A tibble: 10 x 3
#>    LOG_START_DT        LOG_END_DT           Type
#>    <dttm>              <dttm>              <int>
#>  1 2018-03-28 09:30:00 2018-03-28 12:15:00     2
#>  2 2018-03-28 12:16:00 2018-03-28 13:29:00     0
#>  3 2018-03-28 13:30:00 2018-03-28 16:30:00     1
#>  4 2018-03-28 16:31:00 2018-03-28 17:14:00     0
#>  5 2018-03-28 17:15:00 2018-03-28 20:00:00     2
#>  6 2018-03-28 20:01:00 2018-03-28 21:14:00     0
#>  7 2018-03-28 21:15:00 2018-03-29 00:00:00     2
#>  8 2018-03-29 00:00:00 2018-03-29 00:30:00     2
#>  9 2018-03-29 00:31:00 2018-03-29 01:29:00     0
#> 10 2018-03-29 01:30:00 2018-03-29 05:00:00     1

我想如果你真的想要那种糟糕的日期格式,你可以这样做:

baz_FUGLY <- baz %>% 
  mutate_if(is.POSIXct, format, "%m/%d/%Y %H:%M")