使用PySpark转换Unix时间戳为常规日期时间格式失败求助
解决PySpark中毫秒级Unix时间戳转日期时间的异常问题
你的问题根源在于:示例时间戳1683825723389是毫秒级(13位数字),而PySpark的from_unixtime默认只支持秒级(10位数字)时间戳,直接传入毫秒值会导致时间被放大1000倍,从而出现+55328这类异常年份。
正确转换方法
方法1:将毫秒转秒后使用from_unixtime
import pyspark.sql.functions as F # 转换为带时分秒的完整日期时间字符串 df = df.withColumn("datetime", F.from_unixtime(F.col("unix_time_column") / 1000)) # 转换为指定格式的日期(如yyyyMMdd) df = df.withColumn("date", F.from_unixtime(F.col("unix_time_column") / 1000, "yyyyMMdd"))
方法2:使用to_timestamp直接处理(Spark 2.2+支持)
# 先转换为Timestamp类型 df = df.withColumn("datetime", F.to_timestamp(F.col("unix_time_column") / 1000)) # 再格式化为目标字符串格式 df = df.withColumn("date_str", F.date_format(F.col("datetime"), "yyyyMMdd"))
你尝试的方法无效原因分析
F.from_unixtime(F.col("unix_time_column"), "yyyyMMdd"):未将毫秒转秒,时间戳数值过大,计算出错误日期F.from_unixtime("unix_time_column"):同样直接使用毫秒级数值,导致时间计算异常F.expr("from_unixtime(unix_time_column)"):SQL表达式的from_unixtime默认处理秒级时间戳,结果错误F.col("unix_time_column").cast('date'):直接将数值转date类型时,会把数值当作从1970-01-01开始累加的天数,1683825723389天远超出正常日期范围,导致异常
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

