PySpark字符串类型日期转换为指定格式的问题求助
解决PySpark日期格式转换问题
你的问题出在两个核心点:
- 原
date_filing列存在两种不同的字符串格式(纯日期、带微秒及时区的时间戳),你指定单一解析格式"yyyy-MM-dd'T'HH:mm:ss'Z'"会导致大部分值解析失败,生成空值。 - 你最终需要的是字符串类型的格式化日期,但原代码生成的是Timestamp类型,缺少格式转换的关键步骤。
正确处理代码
from pyspark.sql import functions as F from pyspark.sql.types import StringType df = df.withColumn( "time_start", F.when( F.col("date_filing").isNull() | (F.col("date_filing") == ""), F.lit("").cast(StringType()) ).otherwise( F.date_format( F.to_timestamp(F.col("date_filing")), # 自动识别原字符串格式转为Timestamp类型 "yyyy-MM-dd'T'HH:mm:ss'Z'" # 格式化为目标字符串格式 ) ) )
代码说明
to_timestamp不指定格式时,PySpark会自动识别标准日期时间格式(包括你数据里的yyyy-MM-dd和yyyy-MM-dd HH:mm:ss.SSSSSS+00),避免因格式不匹配导致的解析失败。date_format负责将Timestamp类型值转换为你需要的yyyy-MM-ddTHH:mm:ssZ格式字符串。- 保留了对null和空字符串的处理逻辑,返回空字符串。
最终输出结果
运行代码后,DataFrame会生成符合预期的time_start列:
| text | date_filing | time_start |
|---|---|---|
| AAA | 1998-12-22 | 1998-12-22T00:00:00Z |
| BBBB | 2023-08-30 12:03:17.814757+00 | 2023-08-30T12:03:17Z |
| CCC | null | |
| DDD | 2017-11-28 | 2017-11-28T00:00:00Z |
(注:你给出的期望输出中DDD的结果缺少Z,属于笔误,按你要求的格式标准应该包含该后缀)
内容的提问来源于stack exchange,提问作者Anjali Kushwaha
相关产品推荐
相关产品推荐

