pyspark 检查时间戳是否在范围内

uubf1zoe  于 2022-11-01  发布在  Spark
关注(0)|答案(2)|浏览(189)

我正在尝试获取以下信息:

+--------------------+
|work_time | day_shift|
+--------------------+
| 00:45:40 |      No  |
| 10:05:47 |      Yes |
| 15:25:28 |      Yes |
| 19:38:52 |      No  |

在这里我把“工作时间”分类为“白班”。
“是”-如果时间介于09:00:00和18:00:00之间
“否”-否则
我的“work_time”是日期时间格式,只显示时间。我尝试了下面的方法,但我得到的都是“不”。

df = df.withColumn('day_shift', when(df.work_time >= to_timestamp(lit('09:00:00'), 'HH:mm:ss') & df.work_time <= to_timestamp(lit('18:00:00'), 'Yes').otherwise('No'))
gfttwv5a

gfttwv5a1#

首先,spark没有所谓的“Time”数据类型,它只支持TimestampTypeDateType。因此,我相信您的 Dataframe 中的work_time是一个字符串。
其次,当你在选择语句中检查你的func.to_timestamp(func.lit('09:00:00'), 'HH:mm:ss')时,它会显示:

+--------------------------------+
|to_timestamp(09:00:00, HH:mm:ss)|
+--------------------------------+
|1970-01-01 09:00:00             |
+--------------------------------+
only showing top 1 row

最好的方法是将work_time列分别拆分为hourminutesecond列并进行过滤,或者在进行任何时间戳过滤之前在work_time列中添加一个日期值。

a0zr77ik

a0zr77ik2#

您可以使用Column类方法between。它适用于"HH:mm:ss"的 * 时间戳 * 和 * 字符串 *。请使用以下方法:

F.col("work_time").between("09:00:00", "18:00:00")

完整测试:

from pyspark.sql import functions as F
df = spark.createDataFrame([('00:45:40',), ('10:05:47',), ('15:25:28',), ('19:38:52',)], ['work_time'])

day_shift = F.col("work_time").between("09:00:00", "18:00:00")
df = df.withColumn("day_shift", F.when(day_shift, "Yes").otherwise("No"))

df.show()

# +---------+---------+

# |work_time|day_shift|

# +---------+---------+

# | 00:45:40|       No|

# | 10:05:47|      Yes|

# | 15:25:28|      Yes|

# | 19:38:52|       No|

# +---------+---------+

相关问题