我尝试环顾四周,但没有找到类似的问题。欢迎向正确的方向提供帮助。我正在处理电动汽车的充电数据。以下是可重现的示例。时间戳指示相关充电器何时被驾驶员占用。
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"))
df <- data.frame("charger_id" = charger_id, "start_time" = start_time, "end_time" = end_time)
这是我当前数据的结构:
charger_id | start_time | end_time |
1 | 2019-06-13 10:56:36 | 2019-06-13 14:08:10 |
1 | 2019-06-13 15:16:26 | 2019-06-14 10:15:46 |
2 | 2019-06-13 17:55:56 | 2019-06-13 24:20:31 |
3 | 2019-06-13 08:55:27 | 2019-06-13 17:50:51 |
4 | 2019-06-13 04:25:56 | 2019-06-13 09:20:16 |
4 | 2019-06-13 12:45:47 | 2019-06-13 19:20:06 |
我想为每个会话计算每小时使用量。的
time_occupied
列表示特定充电器在特定会话中每小时占用的时间(以分钟为单位)。
例如,关于charger_id = 1
,它的第一次会话是在10:56:36和14:08:10之间进行的,所以这192分钟分散了5个小时。此会话的结果表应如下所示。
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 |
... | ... | ... |
此表是我要查找的很长的最终表的小快照。对于我每天收集的数据charger_id
,每天会有24小时的时间戳记(例如2019-06-13 15:00:00
)和time_occupied
列,表明该会话的每小时占用率。
为进一步澄清,此链接描述了我希望实现的相同目标,但是要求提供SQL:https://community.oracle.com/message/13318002#13318002
答案 0 :(得分:1)
这是一个data.table
解决方案。它使用foverlaps
,这意味着time_used
为0的任何启动时间/充电器ID对都将被排除。如果您想在事实之后再添加这些行,并不是很困难。由于data.table
的{{1}}版本非常快,因此它也应能快速处理大型数据集。
foverlaps
由reprex package(v0.3.0)于2019-09-30创建