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

PySpark中处理多种日期格式问题求助

PySpark 多日期格式解析问题解决

问题背景

我尝试用PySpark处理多种日期数据格式,但使用to_timestamp函数后未得到预期输出。以下是输入数据及尝试的代码:

输入数据

input_data = [
    "2021-06-16T13:24:44.240-05:00",
    "2011-10-20-05:00",
    "1982-09-27-06:00",
    "20/11/2021"
]

尝试的代码

from pyspark.sql import functions as F
from pyspark.sql.functions import col

# 创建DataFrame
df = spark.createDataFrame([(i,) for i in input_data], ["input"])

# 转换日期
dfWithDate = df.withColumn("output", F.to_date(F.to_timestamp(col("input"), "M/d/yyyy H:mm")))

dfWithDate.show()

问题原因

你仅为to_timestamp指定了单一格式"M/d/yyyy H:mm",但输入数据包含4种不同的日期格式,只有完全匹配该格式的字符串能被正确解析,其余都会返回null,最终to_date也会得到null。

解决方案

使用coalesce函数依次尝试多种日期格式,只要某一种格式解析成功就返回对应时间戳,再转换为日期。针对输入数据的每种格式,对应的解析模式如下:

  • "2021-06-16T13:24:44.240-05:00" → "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
  • "2011-10-20-05:00"/"1982-09-27-06:00" → "yyyy-MM-ddXXX"
  • "20/11/2021" → "dd/MM/yyyy"

修改后的代码:

from pyspark.sql import functions as F
from pyspark.sql.functions import col

input_data = [
    "2021-06-16T13:24:44.240-05:00",
    "2011-10-20-05:00",
    "1982-09-27-06:00",
    "20/11/2021"
]

df = spark.createDataFrame([(i,) for i in input_data], ["input"])

dfWithDate = df.withColumn(
    "output",
    F.to_date(
        F.coalesce(
            F.to_timestamp(col("input"), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"),
            F.to_timestamp(col("input"), "yyyy-MM-ddXXX"),
            F.to_timestamp(col("input"), "dd/MM/yyyy")
        )
    )
)

dfWithDate.show()

运行结果

+-------------------------------+----------+
|input                          |output    |
+-------------------------------+----------+
|2021-06-16T13:24:44.240-05:00 |2021-06-16|
|2011-10-20-05:00               |2011-10-20|
|1982-09-27-06:00               |1982-09-27|
|20/11/2021                     |2021-11-20|
+-------------------------------+----------+

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:27:31