从R中的开始/结束时间戳计算每小时间隔

从R中的开始/结束时间戳计算每小时间隔,r,time,R,Time,我试着四处看看,但没有发现类似的问题。欢迎任何指向正确方向的帮助。我正在研究电动汽车充电数据。下面是一个可复制的示例。时间戳指示相关充电器何时被驾驶员占用 charger_id <- c(1, 1, 2, 3, 4, 4) start_time <- as_datetime(c("2019-06-13 10:56:36", "2019-06-13 15:56:36", "2019-06-13 17:55:56", "

我试着四处看看,但没有发现类似的问题。欢迎任何指向正确方向的帮助。我正在研究电动汽车充电数据。下面是一个可复制的示例。时间戳指示相关充电器何时被驾驶员占用

charger_id <- c(1, 1, 2, 3, 4, 4)
start_time <- as_datetime(c("2019-06-13 10:56:36", "2019-06-13 15:56:36", "2019-06-13 17:55:56", "2019-06-13 08:55:27", "2019-06-13 04:25:56", "2019-06-13 12:45:47")) 
end_time <- as_datetime(c("2019-06-13 14:08:10", "2019-06-14 10:15:46", "2019-06-13 23:20:31", "2019-06-13 17:50:51", "2019-06-13 09:20:16", "2019-06-13 19:20:06"))
status <- c("charging", "charging", "charging", "charging", "charging", "charging")
df <-  data.frame("charger_id" = charger_id, "start_time" = start_time, "end_time" = end_time, "status" = status)
我想计算每节课每小时的使用量

例如,关于
charger\u id=1
,它的第一次会话发生在
10:56:36
14:08:10
之间,因此在5个小时内总共192分钟。此会话的结果表应该如下所示

我想要什么:

charger_id |      start_time     |      end_time       |    status     |
     1     | 2019-06-13 10:56:36 | 2019-06-13 14:08:10 |   charging    |
     1     | 2019-06-13 15:16:26 | 2019-06-14 10:15:46 |   charging    |
     2     | 2019-06-13 17:55:56 | 2019-06-13 24:20:31 |   charging    |
     3     | 2019-06-13 08:55:27 | 2019-06-13 17:50:51 |   charging    |
     4     | 2019-06-13 04:25:56 | 2019-06-13 09:20:16 |   charging    |
     4     | 2019-06-13 12:45:47 | 2019-06-13 19:20:06 |   charging    |
charger_id |         hour        |    time_occupied    |
    ...    |         ...         |          ...        |
     1     | 2019-06-13 08:00:00 |           0         |
     1     | 2019-06-13 09:00:00 |           0         |
     1     | 2019-06-13 10:00:00 |           4         |
     1     | 2019-06-13 11:00:00 |           60        |
     1     | 2019-06-13 12:00:00 |           60        |
     1     | 2019-06-13 13:00:00 |           60        |
     1     | 2019-06-13 14:00:00 |           8         |
     1     | 2019-06-13 15:00:00 |           0         |
    ...    |          ...        |          ...        |
time\u occumped
列表示特定会话的特定充电器在特定小时内占用的时间(以分钟为单位)

这个表是我正在寻找的非常长的最终表的一个小快照。对于数据集中的每个
charger\u id
,都会有一个小时时间戳记录(例如
2019-06-13 15:00:00
)和一个
time\u occulated
列,指示会话的小时占用率。数据集中的每个充电器每天有24个小时的时间戳,每周有168个,等等


为了进一步澄清,此链接描述了我希望实现的相同目标,但被要求使用SQL:

以下是一个
data.table
解决方案。它使用
foverlaps
,这意味着任何
time\u used
为0的启动时间/充电器id对都被排除在外。如果您想在事后添加这些行,那么将不会太难。对于大型数据集,它也应该能够快速工作,因为
数据。表
版本的
foverlaps
相当快

库(data.table)
图书馆(lubridate)
充电器id 8:1 2019-06-13 17:00:00 60.000000
#>  9:          1 2019-06-13 18:00:00     60.000000
#> 10:          1 2019-06-13 19:00:00     60.000000
#> 11:          1 2019-06-13 20:00:00     60.000000
#> 12:          1 2019-06-13 21:00:00     60.000000
#> 13:          1 2019-06-13 22:00:00     60.000000
#> 14:          1 2019-06-13 23:00:00     60.000000
#> 15:          2 2019-06-13 17:00:00      4.066667
#> 16:          2 2019-06-13 18:00:00     60.000000
#> 17:          2 2019-06-13 19:00:00     60.000000
#> 18:          2 2019-06-13 20:00:00     60.000000
#> 19:          2 2019-06-13 21:00:00     60.000000
#> 20:          2 2019-06-13 22:00:00     60.000000
#> 21:          2 2019-06-13 23:00:00     20.516667
#> 22:          3 2019-06-13 08:00:00      4.550000
#> 23:          3 2019-06-13 09:00:00     60.000000
#> 24:          3 2019-06-13 10:00:00     60.000000
#> 25:          3 2019-06-13 11:00:00     60.000000
#> 26:          3 2019-06-13 12:00:00     60.000000
#> 27:          3 2019-06-13 13:00:00     60.000000
#> 28:          3 2019-06-13 14:00:00     60.000000
#> 29:          3 2019-06-13 15:00:00     60.000000
#> 30:          3 2019-06-13 16:00:00     60.000000
#> 31:          3 2019-06-13 17:00:00     50.850000
#> 32:          4 2019-06-13 04:00:00     34.066667
#> 33:          4 2019-06-13 05:00:00     60.000000
#> 34:          4 2019-06-13 06:00:00     60.000000
#> 35:          4 2019-06-13 07:00:00     60.000000
#> 36:          4 2019-06-13 08:00:00     60.000000
#> 37:          4 2019-06-13 09:00:00     20.266667
#> 38:          4 2019-06-13 12:00:00     14.216667
#> 39:          4 2019-06-13 13:00:00     60.000000
#> 40:          4 2019-06-13 14:00:00     60.000000
#> 41:          4 2019-06-13 15:00:00     60.000000
#> 42:          4 2019-06-13 16:00:00     60.000000
#> 43:          4 2019-06-13 17:00:00     60.000000
#> 44:          4 2019-06-13 18:00:00     60.000000
#> 45:          4 2019-06-13 19:00:00     20.100000
#>充电器\u id开始时间\u占用

创建于2019-09-30,由(v0.3.0)

创建,我不确定您想做什么。看起来您想要的结果具有相同的
charger\u id
end\u time
。我完全不清楚修改后的
开始时间是什么意思,也不清楚您是如何计算的。很抱歉造成混淆。我已经编辑了我的问题,我希望我现在想做的更清楚。越来越清楚。请指定
use
代表的内容或计算方式好吗?我有一些想法,但它们相互矛盾,所以至少我的一个想法是错误的好的,我试着回答你的问题,并更详细地解释我要找的最终表格。我希望这能更好地解释问题谢谢你的回答。这就是我要找的。我希望您能澄清一些DT语法(我更熟悉tidyverse)。你能解释一下:1)你是如何在这个操作中使用.SD的,(子集是什么?)和2)当你分配列占用的时间时,
(开始,充电器id)
做了什么?当然!首先,在
data.table
语法中,方括号包含3个参数:
[i,j,by]
。第一个,
i
主要处理子集行。第二个,
j
主要处理列选择或转换。最后,
by
处理分组。你的两个问题实际上是相互关联的
(启动,充电器id)
本质上意味着“按照我的要求,在
启动
充电器id
的每种组合中执行”。因此,当我在
j
参数中使用
.SD
时,我基本上是将其细分为一个
data.table
,它只有一个
start
charger\u id
的组合。