如果我的数据框有两个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)|
由于
答案 0 :(得分:1)
如果开始和结束之间的差异始终小于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] |
+---------------------+---------------------+------------+
注意:对于时间戳之间的较大差异,可以调整上述代码以将其考虑在内。然后有必要查看除小时之外的其他字段,例如日/月/年。