检查时间戳是否在范围内



我正在尝试获得以下内容:

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

其中我将";工作时间";变成";day_shift">
"是"-如果时间落在09:00:00和18:00:00之间;否"-否则

我的"工作时间";是日期时间格式,仅显示时间。我尝试了以下方法,但我只是得到了";否";为所有事情。

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'))

您可以使用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|
# +---------+---------+

首先,spark没有所谓的"时间";数据类型,它只支持TimestampTypeDateType。因此,我相信数据帧中的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列中添加日期值。

相关内容

  • 没有找到相关文章

最新更新