PySpark将带英文月份的字符串日期时间转时间戳返回null问题
问题根因
三种写法全部返回null的核心原因是日期格式不匹配:
cast("timestamp")和不带格式参数的f.to_timestamp(),默认仅支持解析yyyy-MM-dd HH:mm:ss格式的时间字符串(例:2022-06-30 14:00:00)- 你的输入字符串格式为
dd-MMM-yyyy HH:mm:ss(日-三位英文月份缩写-年 时:分:秒),和默认解析规则完全不符,解析失败就会返回null值。
修复方案
调用f.to_timestamp()时传入第二个参数,明确指定输入字符串对应的日期格式模板即可。
完整可运行代码:
from pyspark.sql import functions as f from pyspark.sql.types import StructType, StructField, StringType # 测试数据 data = [ ("30-Jun-2022 14:00:00",), ("25-Jul-2022 11:00:00",), ("10-May-2022 12:00:00",), ("11-Jan-2022 09:00:00",) ] schema = StructType([ StructField("date_string", StringType(), True) ]) df = spark.createDataFrame(data=data, schema=schema) # 带格式参数的时间转换 df = df.withColumn( "parsed_timestamp", f.to_timestamp(f.col("date_string"), "dd-MMM-yyyy HH:mm:ss") ) df.show(truncate=False)
运行输出:
+---------------------+-------------------+ |date_string |parsed_timestamp | +---------------------+-------------------+ |30-Jun-2022 14:00:00|2022-06-30 14:00:00| |25-Jul-2022 11:00:00|2022-07-25 11:00:00| |10-May-2022 12:00:00|2022-05-10 12:00:00| |11-Jan-2022 09:00:00|2022-01-11 09:00:00| +---------------------+-------------------+
补充说明
- 用到的格式符对应含义:
dd代表两位日期、MMM代表三位英文缩写月份、yyyy代表四位年份、HH代表24小时制小时、mm代表分钟、ss代表秒。 - 如果运行时出现英文月份无法识别的问题,可以先执行
spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")调整时间解析策略,再运行转换逻辑。
注意:你提供的最小可复现示例本身存在语法问题:单元素元组末尾必须加逗号,否则Python会把括号内的内容识别为普通字符串而非元组,创建DataFrame时会报结构不匹配错误,正确写法为
("30-Jun-2022 14:00:00",)。
内容的提问来源于stack exchange,提问作者OdiumPura
相关产品推荐
相关产品推荐

