PySpark中mm/yyyy字符串转月初日期返回null问题解决
问题成因
转换逻辑返回null是两个原因导致的:
- 格式符误用:Spark的日期解析底层遵循Java SimpleDateFormat规范,小写
m代表分钟字段,大写M才代表月份字段,你写的m/yyyy会把斜杠前的数字识别为分钟值,和年月的语义完全不匹配。 - 缺失必要日期字段:
to_date函数要求解析模式必须覆盖年、月、日三个完整日期维度,就算把月份格式符修正为大写M,M/yyyy的模式仅包含年、月信息,没有日字段的解析规则,Spark不会自动补全日取值,依然会解析失败返回null。
正确实现方式
最通用的实现思路是先给原年月字符串拼接固定的日值/1,把字符串格式补全为M/1/yyyy的完整日期格式,再调用to_date解析,全版本Spark都兼容:
from pyspark.sql.functions import col, to_date, concat, lit monthdf.select( col("PP Month"), # 原字符串拼接/1补全为月/日/年格式,再用对应模式解析 to_date(concat(col("PP Month"), lit("/1")), "M/d/yyyy").alias("date") ).show()
如果你的Spark版本为3.1及以上,也可以用make_date函数直接拆分年、月构造日期,逻辑更直观:
from pyspark.sql.functions import col, make_date, split monthdf.select( col("PP Month"), make_date( split(col("PP Month"), "/")[1].cast("int"), # 拆分后取斜杠后的值作为年 split(col("PP Month"), "/")[0].cast("int"), # 拆分后取斜杠前的值作为月 lit(1) # 固定日为当月1号 ).alias("date") ).show()
如果最终需要输出mm/1/yyyy格式的字符串而非日期类型,可以在得到日期列之后调用date_format做格式化:
from pyspark.sql.functions import date_format # 将日期类型转为指定格式的字符串 date_format(col("date"), "M/1/yyyy").alias("formatted_date_str")
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

