从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
的组合。