PySpark转换指定格式字符串为datetime返回NULL如何解决?
问题根因
你的转换失败是由以下几个格式配置错误导致的:
- 月份格式符使用错误:
L用于匹配数字格式的月份(如07、7),你当前的月份是英文短名称Jul,需要改用MMM匹配。 - 时区格式符使用错误:不能直接把
UTC写死在格式串中,需要用z匹配时区缩写字段。 - 小时格式符不匹配:
hh是12小时制格式符,若你的时间为24小时制需要改用HH,避免后续出现下午时间解析错误。 - 区域配置问题:若Spark运行环境默认locale不是英文,无法识别
Thu、Jul这类英文缩写,需要指定英文区域。
修正后的代码
import pyspark.sql.functions as F df.select( 'Created Time', # 第三个参数指定英文区域,适配非英文运行环境 F.to_timestamp(F.col('Created Time'), 'E MMM dd HH:mm:ss z yyyy', 'en_US').alias('parsed_datetime') ).show(1, False)
格式符对应说明
E:匹配星期短名称(对应样例中的Thu)MMM:匹配月份短名称(对应样例中的Jul)dd:匹配两位日期(对应样例中的01)HH:匹配24小时制小时(对应样例中的09)mm:ss:匹配分钟、秒z:匹配时区短名称(对应样例中的UTC)yyyy:匹配四位年份(对应样例中的2021)
如果使用的Spark版本低于3.0,不支持to_timestamp的locale参数,可以在初始化SparkSession时配置全局会话locale:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("time_parse") \ .config("spark.sql.session.locale", "en_US") \ .getOrCreate()
内容的提问来源于stack exchange,提问作者Suman Chakraborty
相关产品推荐
相关产品推荐

