PySpark如何将带T、Z的日期时间字符串转换为timestamp类型
问题原因
你当前使用的格式字符串和实际存储的日期时间格式不匹配,这是返回空值的核心原因,漏写了多个必填匹配项:
- 日期和时间段之间的固定分隔符
T未声明 - 秒和小数秒之间的分隔符是
.,不是你代码中写的: - 输入时间包含7位小数秒,且末尾有标识UTC时区的固定字符
Z,原格式串未覆盖这两部分
正确实现方案
基础版(严格匹配你给出的样例格式,Spark 3.0+适用)
from pyspark.sql.functions import to_timestamp, col df3.select( to_timestamp(col("DateTime"), "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'").alias('dt'), col("DateTime") ).show()
兼容版(适配小数秒位数不固定的场景)
如果同列下不同行的小数秒位数有3位、6位、7位的差异,可以用方括号标记可选匹配段:
df3.select( to_timestamp(col("DateTime"), "yyyy-MM-dd'T'HH:mm:ss[.SSSSSSS][.SSSSSS][.SSS]'Z'").alias('dt'), col("DateTime") ).show()
低版本Spark兼容方案
如果你使用的是Spark 2.x,不支持解析3位以上的小数秒,可以先做字符串截断后再转换:
from pyspark.sql.functions import substring df3.select( to_timestamp(substring(col("DateTime"), 1, 23), "yyyy-MM-dd'T'HH:mm:ss.SSS").alias('dt'), col("DateTime") ).show()
时区转换可选配置
末尾的Z代表UTC时区,如果你需要转换为国内东八区时间,可以传入时区参数:
df3.select( to_timestamp(col("DateTime"), "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'") .withTimeZone("Asia/Shanghai") .alias('dt_cst'), col("DateTime") ).show()
内容的提问来源于stack exchange,提问作者thedataguy
相关产品推荐
相关产品推荐

