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

Spark 3.1中批量转换指定格式字符串日期至目标日期格式

Spark 3.1 日期列批量转换解决方案

空值问题根源

你当前代码返回空值是因为格式参数与源数据不匹配:源数据是MM/dd/yyyy或MM/dd/yy格式,却用了dd-MM-yy作为解析格式,导致Spark无法识别日期,返回null。

单列转换逻辑

要实现「仅转换MM/dd/yyyy/MM/dd/yy格式为dd-MM-yyyy,保留已有dd-MM-yyyy格式」的需求,可通过正则匹配格式+条件转换实现:

from pyspark.sql.functions import when, regexp_like, to_date, date_format

# 以列A为例
df = df.withColumn(
    "A",
    when(
        # 匹配MM/dd/yyyy或MM/dd/yy格式
        regexp_like("A", r"^\d{2}/\d{2}/\d{4}$") | regexp_like("A", r"^\d{2}/\d{2}/\d{2}$"),
        # 先转成日期类型,再格式化为dd-MM-yyyy
        date_format(to_date("A", "MM/dd/yyyy"), "dd-MM-yyyy")
    ).otherwise("A")  # 不符合格式的(即已为dd-MM-yyyy)直接保留
)

批量处理5个列

直接用for循环遍历目标列列表即可,无需重复写代码:

# 替换为你的5个日期列名
target_cols = ["A", "B", "C", "D", "E"]

for col in target_cols:
    df = df.withColumn(
        col,
        when(
            regexp_like(col, r"^\d{2}/\d{2}/\d{4}$") | regexp_like(col, r"^\d{2}/\d{2}/\d{2}$"),
            date_format(to_date(col, "MM/dd/yyyy"), "dd-MM-yyyy")
        ).otherwise(col)
    )

测试验证

针对你给出的示例数据(转换为Spark DataFrame后):
输入:

AB
10/23/201909/13/2021
06/16/202003/16/2021
09/06/202212/23/2019

执行代码后输出:

AB
23-10-201913-09-2021
16-06-202016-03-2021
06-09-202223-12-2019

完全符合期望结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:05:37