我在 R 中处理大型数据集。该数据集记录了一年中骑自行车的开始和结束时间,分别使用列“started_at”和“ended_at”。我想在 ggplot 中创建一个面积图,显示 24 小时内骑自行车的活动。因此,x 轴应该从 00:00:00 开始,到 23:59:59 结束。理想情况下,我会精确到秒。 y 轴将显示在任何设定时间内所有活跃的自行车骑行。例如,如果数据集仅包含两次游乐设施: 2023-01-01 23:00:00--2023-01-02 01:00:00 2023-01-05 00:00:00--2023-01-05 01:00:00 然后图表应该显示从 00:00:00 到 01:00:00 的直线值 2,下降到 0,然后从 23:00:00 到 23:59:59 上升到 1。
为了完成这个任务,我首先需要制作一个数据框,列出从 00:00:00 到 23:59:59 的所有时间。我用这段代码做到了:
df <- data.frame(time = format(seq(from = as.POSIXct("00:00:00", format = "%T"), to = as.POSIXct(
"23:59:59", format = "%T"), by = "1 sec"), "%H:%M:%S"))
然后,我需要记录在某一时刻有多少行程是活跃的。我目前有一种方法可以执行此操作,只要 ended_at > started_at(当行程未在午夜或 DST 回滚期间发生时)。我还没有尝试解决这个问题。我想出的代码看起来像这样:
sum(mapply(between, "03:00:00", format(as.POSIXct(sample$started_at), "%H:%M:%S"), format(as.POSIXct(sample$ended_at), "%H:%M:%S")))
对于 100,000 行样本,代码需要约 10 秒才能完成。我需要处理 400 万行 86400 次不同的时间。我可以通过只查看每小时来降低准确性,但代码仍然太慢。有没有更有效的编码方式?