У меня есть большой постоянно отслеживаемый столбец даты и времени, который мне нужно разделить на получасовые периоды.
Я пробовал некоторый код r
data.table
, чтобы отделить их, но проблемаостается в переходном периоде от одного периода к другому.
Приведенный ниже df
кадр данных является минимальным игрушечным примером этих данных.
library(data.table)
library(lubridate)
driver = rep(c("foo", "bar"), each = 10L)
dt = ymd_hm(c(
"2015-05-27 07:11", "2015-05-27 07:25", "2015-05-27 07:35",
"2015-05-27 07:42", "2015-05-27 07:53",
"2015-05-27 08:09", "2015-05-27 08:23", "2015-05-27 08:39",
"2015-05-27 08:52", "2015-05-27 09:12",
"2015-05-27 16:12", "2015-05-27 16:31", "2015-05-27 16:39",
"2015-05-27 16:53", "2015-05-27 17:29",
"2015-05-27 17:41", "2015-05-27 17:58", "2015-05-27 18:09",
"2015-05-27 18:23", "2015-05-27 18:42")
)
df = data.table(driver, dt)
Я пробовал следующий код для их разделения:
df[,diff := as.integer(difftime(dt, shift(dt, 1), units = "mins")),
by = driver]
df[, diff := {diff[1] = 0L; diff}, driver]
df[,cum_mins := cumsum(diff), driver]
df[,cum_halfhour := round(cum_mins/30, 3), driver]
df[,flag := floor(cum_halfhour), driver]
В результате получается таблица
> df
driver dt diff cum_mins cum_halfhour flag
1: foo 2015-05-27 07:11:00 0 0 0.000 0
2: foo 2015-05-27 07:25:00 14 14 0.467 0
3: foo 2015-05-27 07:35:00 10 24 0.800 0
4: foo 2015-05-27 07:42:00 7 31 1.033 1
5: foo 2015-05-27 07:53:00 11 42 1.400 1
6: foo 2015-05-27 08:09:00 16 58 1.933 1
7: foo 2015-05-27 08:23:00 14 72 2.400 2
8: foo 2015-05-27 08:39:00 16 88 2.933 2
9: foo 2015-05-27 08:52:00 13 101 3.367 3
10: foo 2015-05-27 09:12:00 20 121 4.033 4
11: bar 2015-05-27 16:12:00 0 0 0.000 0
12: bar 2015-05-27 16:31:00 19 19 0.633 0
13: bar 2015-05-27 16:39:00 8 27 0.900 0
14: bar 2015-05-27 16:53:00 14 41 1.367 1
15: bar 2015-05-27 17:29:00 36 77 2.567 2
16: bar 2015-05-27 17:41:00 12 89 2.967 2
17: bar 2015-05-27 17:58:00 17 106 3.533 3
18: bar 2015-05-27 18:09:00 11 117 3.900 3
19: bar 2015-05-27 18:23:00 14 131 4.367 4
20: bar 2015-05-27 18:42:00 19 150 5.000 5
Столбец flag
- это то, что я хочу, но не совсем.Проблема возникает при переходе строк между flag
с.Например, в строках 3 и 4 я хочу, чтобы алгоритм помечал строку 4 как 0, потому что строка 4 * ближе к точке получаса, чем строка 3 (cum_halfhour равен 31 по сравнению с 24).Та же проблема остается в строках 9 и 10.
Проблема в этом текущем алгоритме состоит в том, что он всегда этажей совокупное время до 30-минутного периода.Но на практике временные интервалы нерегулярны, поэтому более реалистично размещать точку отсечения в ближайшей 30-минутной точке.Как объяснено в примере 3 и 4 строки выше.
Решение может быть простым, но я не могу придумать его.Любые предложения для достижения этого алгоритма?Спасибо!