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

PySpark 3.5中多格式字符串转yyyy-MM-dd日期格式的实现方法

PySpark 3.5 多格式日期统一转换为yyyy-MM-dd方案

PySpark的to_date函数不像Pandas的to_datetime那样能自动识别多种日期格式,默认只匹配单一格式(通常是yyyy-MM-dd),所以其他格式的日期会被转成NULL。针对你遇到的混合格式场景,有两种实用解法:

方法一:用coalesce匹配多种格式

通过coalesce依次尝试不同格式的to_date转换,返回第一个非NULL的结果,直接覆盖所有已知格式:

from pyspark.sql import functions as F

# 假设数据框为df,日期列名为original_date
df = df.withColumn(
    "standard_date",
    F.coalesce(
        F.to_date(F.col("original_date"), "yyyy/MM/dd"),  # 处理斜杠分隔格式
        F.to_date(F.col("original_date"), "yyyyMMdd"),    # 处理8位纯数字格式
        F.to_date(F.col("original_date"), "yyyy-MM-dd")   # 处理横杠分隔格式
    )
)

这种方法简洁直接,适合已知所有日期格式的场景,NULL值会被保留。

方法二:先统一日期字符串格式再转换

如果后续可能出现更多格式,先通过字符串处理把所有日期统一成yyyy-MM-dd格式,再用to_date转换:

from pyspark.sql import functions as F

df = df.withColumn(
    "formatted_str",
    # 处理8位纯数字的日期(比如20201227)
    F.when(
        F.col("original_date").cast("string").rlike("^\\d{8}$"),
        F.concat(
            F.substring(F.col("original_date").cast("string"), 1, 4),
            F.lit("-"),
            F.substring(F.col("original_date").cast("string"), 5, 2),
            F.lit("-"),
            F.substring(F.col("original_date").cast("string"), 7, 2)
        )
    # 处理斜杠分隔的日期,替换成横杠
    ).otherwise(F.regexp_replace(F.col("original_date").cast("string"), "/", "-"))
).withColumn(
    "standard_date",
    F.to_date(F.col("formatted_str"), "yyyy-MM-dd")
)

这里先把整数类型的日期转成字符串,通过正则判断是否是8位数字,拆分后拼接成横杠分隔的格式;其他格式直接把斜杠替换成横杠,最后统一转换为日期类型,NULL值同样保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:59:54