You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark字符串格式日期转日期格式返回Null求助

PySpark字符串日期"01-JAN-22"转日期格式返回Null的解决方法

问题核心是未指定匹配目标字符串的日期格式,默认解析规则无法识别DD-MMM-YY这种包含英文月份缩写和两位年份的格式,导致返回Null。以下是具体解决方法:

一、使用PySpark内置函数转换

利用to_date函数,显式指定日期格式为dd-MMM-yy,同时注意英文月份缩写的locale适配:

from pyspark.sql import SparkSession
from pyspark.sql.functions import to_date

spark = SparkSession.builder.appName("DateFix").getOrCreate()

# 构造测试数据
test_data = [("01-JAN-22",), ("20-DEC-23",), ("10-MAY-21",)]
df = spark.createDataFrame(test_data, ["raw_date"])

# 转换日期列,指定匹配格式
df = df.withColumn("converted_date", to_date(df.raw_date, "dd-MMM-yy"))

# 若环境默认locale非英文,需显式指定locale参数
# df = df.withColumn("converted_date", to_date(df.raw_date, format="dd-MMM-yy", options={"locale": "en_US"}))

df.show()

执行后会输出转换后的日期列,不再返回Null。

二、使用SQL函数转换

先将DataFrame注册为临时视图,再通过SQL语句调用to_date函数完成转换:

# 注册临时视图
df.createOrReplaceTempView("date_view")

# 执行SQL转换
result_df = spark.sql("""
    SELECT raw_date, to_date(raw_date, 'dd-MMM-yy') AS converted_date
    FROM date_view
""")

# 若存在locale问题,可先配置会话locale
# spark.conf.set("spark.sql.locale", "en_US")

result_df.show()

关键注意事项

  • 格式字符串必须严格匹配输入:dd对应两位日期,MMM对应英文月份缩写(多数环境下大小写不敏感),yy对应两位年份
  • 若仍返回Null,检查Spark会话的locale设置,显式指定en_US locale可解决大部分英文月份解析失败问题
  • 两位年份默认解析范围为1970-2069,如需调整可修改spark.sql.legacy.timeParserPolicy等配置参数

内容的提问来源于stack exchange,提问作者Vikas Ubale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:15:36