PySpark中为DataFrame生成datetime.time类型列报错的解决方法
解决PySpark中从HOURS和MIN列构造TIME列的TypeError问题
你遇到的问题很典型:Python标准库的datetime.time()函数只能接收普通整数,但你传入的是PySpark的Column对象——这是分布式计算中的抽象数据结构,不是单个的数值,所以会触发TypeError: an integer is required。
下面给你两种可行的解决方案,优先推荐第一种(性能更优):
方法1:使用PySpark内置函数构造时间类型(推荐)
PySpark提供了专门的时间处理函数,不需要依赖Python本地的datetime库,性能更适合大数据场景。我们可以先把小时和分钟拼接成标准的HH:mm格式字符串,再用to_time()函数(Spark 3.0及以上支持)转换为时间类型:
from pyspark.sql import functions as F # 对小时/分钟补前导零(比如9→09,5→05),拼接成HH:mm格式后转成time类型 data = data.withColumn( "TIME", F.to_time(F.concat_ws(":", F.lpad(F.col("HOURS"), 2, "0"), F.lpad(F.col("MIN"), 2, "0"))) )
如果你的Spark版本低于3.0,可以用to_timestamp()先转成时间戳,再提取时间部分:
data = data.withColumn( "TIME", F.date_format( F.to_timestamp(F.concat_ws(":", F.col("HOURS"), F.col("MIN")), "HH:mm"), "HH:mm:ss" ).cast("time") )
方法2:使用UDF(用户自定义函数)
如果需要更灵活的逻辑,可以用UDF把每行的小时和分钟数值转换成datetime.time对象,但要注意UDF的性能比内置函数差,适合小数据量场景:
from pyspark.sql import functions as F from pyspark.sql.types import TimeType import datetime as dt # 定义转换函数:接收整数小时和分钟,返回datetime.time对象 def create_time(hours, mins): return dt.time(hours, mins) # 注册UDF,指定返回类型为TimeType time_udf = F.udf(create_time, TimeType()) # 应用UDF到DataFrame data = data.withColumn("TIME", time_udf(F.col("HOURS"), F.col("MIN")))
验证结果
转换后你的DataFrame会新增正确的TIME列,示例如下:
+-----+---+--------+ |HOURS|MIN|TIME | +-----+---+--------+ |9 |25 |09:25:00| |22 |5 |22:05:00| |22 |5 |22:05:00| |22 |5 |22:05:00| +-----+---+--------+
内容的提问来源于stack exchange,提问作者Valentina
相关产品推荐
相关产品推荐

