Как рассчитать часы, активные между двумя метками времени - PullRequest
0 голосов
/ 17 мая 2018

Если у меня есть датафрейм с двумя Timestamps, называемыми «начало» и «конец», как я могу рассчитать список всех часов между «началом» и «концом»?

Другое словосказать, что это может быть "в какие часы была активна запись"?

Например:

// Input
|              start|                end|
|2017-06-01 09:30:00|2017-06-01 11:30:00|
|2017-06-01 14:00:00|2017-06-01 14:30:00|

// Result
|              start|                end|hours_active|
|2017-06-01 09:30:00|2017-06-01 11:30:00|   (9,10,11)|
|2017-06-01 14:00:00|2017-06-01 14:30:00|        (14)|

Спасибо

1 Ответ

0 голосов
/ 17 мая 2018

Если разница между началом и концом всегда меньше 24 часов, вы можете использовать следующее UDF.Предполагая, что тип столбцов Timestamp:

val getActiveHours = udf((s: Long, e: Long) => {
  if (e >= s) {
    val diff = e - s
    (s to (s+diff)).toSeq
  } else {
    // the end is in the next day
    (s to 24).toSeq ++ (1L to e).toSeq 
  }
})

df.withColumn("hours_active", getActiveHours(hour($"start"), hour($"end")))

Использование данных примера в вопросе дает:

+---------------------+---------------------+------------+
|start                |end                  |hours_active|
+---------------------+---------------------+------------+
|2017-06-01 09:30:00.0|2017-06-01 11:30:00.0|[9, 10, 11] |
|2017-06-01 14:00:00.0|2017-06-01 14:30:00.0|[14]        |
+---------------------+---------------------+------------+

Примечание: Длябольшие различия между временными метками вышеупомянутого кода могут быть скорректированы, чтобы принять это во внимание.Затем необходимо будет посмотреть на другие поля в дополнение к часу, например, день / месяц / год.

...