从R

时间:2019-09-30 13:37:00

标签: 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", "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

1 个答案:

答案 0 :(得分:1)

这是一个data.table解决方案。它使用foverlaps,这意味着time_used为0的任何启动时间/充电器ID对都将被排除。如果您想在事实之后再添加这些行,并不是很困难。由于data.table的{​​{1}}版本非常快,因此它也应能快速处理大型数据集。

foverlaps

reprex package(v0.3.0)于2019-09-30创建