在 dplyr 和 lubridate 中创建日期时间值运行

问题描述 投票:0回答:1

我想创建日期时间段的运行(白天 = 早上 6 点到下午 5:59 之间,晚上 = 下午 6 点到早上 5:59 之间),这样每个后续时间段都会得到它的排名。

每个昼/夜周期可能包含任意数量的行。有时会丢失整个时间段(例如,一天的时间段后跟第二天的一天的时间段 - 那些应该得到不同的排名)。

我正在专门寻找

dplyr
解决方案或可以轻松集成到 dplyr 工作流程中的解决方案。

这里是一个数据示例:

structure(list(SubDateTime = structure(c(1555187547, 1555194755, 
1555231810, 1555573511, 1555664546, 1555702679, 1555704545, 1555706119, 
1555707855, 1555709640, 1555713244, 1555722752, 1555753649, 1555837869
), tzone = "UTC", class = c("POSIXct", "POSIXt"))), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -14L))

期望的输出:

   SubDateTime           Rank
   <dttm>                <dbl>
 1 2019-04-13 20:32:27       1
 2 2019-04-13 22:32:35       1
 3 2019-04-14 08:50:10       2
 4 2019-04-18 07:45:11       3
 5 2019-04-19 09:02:26       4
 6 2019-04-19 19:37:59       5
 7 2019-04-19 20:09:05       5
 8 2019-04-19 20:35:19       5
 9 2019-04-19 21:04:15       5
10 2019-04-19 21:34:00       5
11 2019-04-19 22:34:04       5
12 2019-04-20 01:12:32       5
13 2019-04-20 09:47:29       6
14 2019-04-21 09:11:09       7
r datetime dplyr lubridate
1个回答
1
投票

你可以试试

library(dplyr)
library(data.table)

df %>%
  mutate(Rank = rleid(floor((as.numeric(SubDateTime) - 21600)/43200))) 

   SubDateTime           key
   <dttm>              <int>
 1 2019-04-13 20:32:27     1
 2 2019-04-13 22:32:35     1
 3 2019-04-14 08:50:10     2
 4 2019-04-18 07:45:11     3
 5 2019-04-19 09:02:26     4
 6 2019-04-19 19:37:59     5
 7 2019-04-19 20:09:05     5
 8 2019-04-19 20:35:19     5
 9 2019-04-19 21:04:15     5
10 2019-04-19 21:34:00     5
11 2019-04-19 22:34:04     5
12 2019-04-20 01:12:32     5
13 2019-04-20 09:47:29     6
14 2019-04-21 09:11:09     7
© www.soinside.com 2019 - 2024. All rights reserved.