将时间分成每 30 分钟的时间段

Dividing the time into periods each 30 min

我有 Dataframe 包含 "time" 列 我想在将时间分成每 30 分钟的周期后添加一个包含周期数的新列 例如, 原始数据框

l = [('A','2017-01-13 00:30:00'),('A','2017-01-13 00:00:01'),('E','2017-01-13 14:00:00'),('E','2017-01-13 12:08:15')]
df = spark.createDataFrame(l,['test','time'])
df1 = df.select(df.test,df.time.cast('timestamp'))
df1.show()
+----+-------------------+
|test|               time|
+----+-------------------+
|   A|2017-01-13 00:30:00|
|   A|2017-01-13 00:00:01|
|   E|2017-01-13 14:00:00|
|   E|2017-01-13 12:08:15|
+----+-------------------+

所需的数据框如下:

+----+-------------------+------+
|test|               time|period|
+----+-------------------+------+
|   A|2017-01-13 00:30:00|     2|
|   A|2017-01-13 00:00:01|     1|
|   E|2017-01-13 14:00:00|    29|
|   E|2017-01-13 12:08:15|    25|
+----+-------------------+------+

有什么方法可以实现吗?

您可以简单地利用 hourminute 内置函数 来获得 when 的最终结果内置函数

from pyspark.sql import functions as F
df1.withColumn('period', (F.hour(df1['time'])*2)+1+(F.when(F.minute(df1['time']) >= 30, 1).otherwise(0))).show(truncate=False)

你应该得到

+----+---------------------+------+
|test|time                 |period|
+----+---------------------+------+
|A   |2017-01-13 00:30:00.0|2     |
|A   |2017-01-13 00:00:01.0|1     |
|E   |2017-01-13 14:00:00.0|29    |
|E   |2017-01-13 12:08:15.0|25    |
+----+---------------------+------+

希望回答对你有帮助