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

PySpark中date_format转DateType后返回null的问题求助

问题分析与解决方案

核心问题原因

你的代码存在三个关键错误:

  1. 函数用途搞反:date_format是将日期类型转为指定格式的字符串,而非把字符串转为日期。你需要的是将字符串转为日期的to_date函数。
  2. 格式符错误:DD代表「一年中的第几天」,月份内的日期应该用dd;YYYY是基于周的周年,日常日期转换建议用yyyy。
  3. 截取逻辑可能有误:原代码中计算截取起始位置的方式存在偏差,可能导致截取的字符串并非有效日期格式。

修正后的代码

import pyspark.sql.functions as F
from pyspark.sql import types as T

data = [[23435,'12321-20220212','2023-01-17'],[23456,'qweea-20221203','2023-01-15']]
cols = ["brand","dept","date"]

df = spark.createDataFrame(data, cols)

df_result = df\
    # 计算反转后'-'的位置
    .withColumn("dash_pos_reversed", F.instr(F.reverse(F.col("dept")), '-'))\
    # 转换为原字符串中'-'的位置
    .withColumn("dash_pos", F.length(F.col("dept")) - F.col("dash_pos_reversed") + 1)\
    # 截取'-'后方的8位日期字符串
    .withColumn("filedate_str", F.substring(F.col("dept"), F.col("dash_pos") + 1, 8))\
    # 将字符串转为DateType(假设截取的是yyyymmdd格式,若为ddmmyyyy则改用'ddMMyyyy')
    .withColumn("filedate", F.to_date(F.col("filedate_str"), "yyyyMMdd"))

df_result.select("dept", "filedate_str", "filedate").show()

执行结果

+----------------+-----------+----------+
|            dept|filedate_str|  filedate|
+----------------+-----------+----------+
|12321-20220212|   20220212|2022-02-12|
|qweea-20221203|   20221203|2022-12-03|
+----------------+-----------+----------+

额外说明

如果你确实需要先生成MM/dd/yyyy格式的字符串再转日期,可添加冗余转换步骤(不推荐,效率更低):

.withColumn("filedate_str_formatted", F.date_format(F.to_date(F.col("filedate_str"), "yyyyMMdd"), "MM/dd/yyyy"))\
.withColumn("filedate", F.to_date(F.col("filedate_str_formatted"), "MM/dd/yyyy"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:35:42