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

PySpark中如何仅对单数字月份的日期字符串条件前置补0

解决PySpark日期格式转换问题

最优解法:直接解析原日期格式

不需要先替换分隔符再补0,Spark的日期解析支持单数字的月份/日期,直接指定原日期格式"M/d/yyyy"即可完成解析,再转换为目标格式:

from pyspark.sql import functions as F

df = df.withColumn("Date", F.date_format(F.to_date(F.col("Date"), "M/d/yyyy"), "yyyy-MM-dd"))

按你的思路实现仅单数字月份补0

如果一定要保留替换分隔符的逻辑,可通过正则表达式仅对第一个-前是单个数字的字符串补0:

from pyspark.sql import functions as F

df = df.withColumn("Date", F.regexp_replace('Date', '/', '-'))\
       # 匹配开头为单个数字+'-'的情况,替换为0+数字+'-'
       .withColumn("Date", F.regexp_replace('Date', '^(\d)-', '0$1-'))\
       .withColumn("Date", F.date_format(F.to_date(F.col("Date"), "MM-dd-yyyy"), "yyyy-MM-dd"))

也可以用when函数判断月份长度实现:

from pyspark.sql import functions as F

df = df.withColumn("Date", F.regexp_replace('Date', '/', '-'))\
       .withColumn("Date", 
                   F.when(F.length(F.split(F.col("Date"), "-")[0]) == 1, 
                          F.concat(F.lit("0"), F.col("Date")))
                   .otherwise(F.col("Date")))\
       .withColumn("Date", F.date_format(F.to_date(F.col("Date"), "MM-dd-yyyy"), "yyyy-MM-dd"))

错误原因说明

你遇到的SparkUpgradeException是因为Spark 3.0+的日期解析器更严格:MM格式要求两位数字的月份,而3-28-2023中的月份是单个数字,不符合解析规则。使用M格式符则支持单/双数字的月份,能避免这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:02:29