PySpark 3.5中多格式字符串转yyyy-MM-dd日期格式的实现方法
PySpark 3.5 多格式日期统一转换为yyyy-MM-dd方案
PySpark的to_date函数不像Pandas的to_datetime那样能自动识别多种日期格式,默认只匹配单一格式(通常是yyyy-MM-dd),所以其他格式的日期会被转成NULL。针对你遇到的混合格式场景,有两种实用解法:
方法一:用coalesce匹配多种格式
通过coalesce依次尝试不同格式的to_date转换,返回第一个非NULL的结果,直接覆盖所有已知格式:
from pyspark.sql import functions as F # 假设数据框为df,日期列名为original_date df = df.withColumn( "standard_date", F.coalesce( F.to_date(F.col("original_date"), "yyyy/MM/dd"), # 处理斜杠分隔格式 F.to_date(F.col("original_date"), "yyyyMMdd"), # 处理8位纯数字格式 F.to_date(F.col("original_date"), "yyyy-MM-dd") # 处理横杠分隔格式 ) )
这种方法简洁直接,适合已知所有日期格式的场景,NULL值会被保留。
方法二:先统一日期字符串格式再转换
如果后续可能出现更多格式,先通过字符串处理把所有日期统一成yyyy-MM-dd格式,再用to_date转换:
from pyspark.sql import functions as F df = df.withColumn( "formatted_str", # 处理8位纯数字的日期(比如20201227) F.when( F.col("original_date").cast("string").rlike("^\\d{8}$"), F.concat( F.substring(F.col("original_date").cast("string"), 1, 4), F.lit("-"), F.substring(F.col("original_date").cast("string"), 5, 2), F.lit("-"), F.substring(F.col("original_date").cast("string"), 7, 2) ) # 处理斜杠分隔的日期,替换成横杠 ).otherwise(F.regexp_replace(F.col("original_date").cast("string"), "/", "-")) ).withColumn( "standard_date", F.to_date(F.col("formatted_str"), "yyyy-MM-dd") )
这里先把整数类型的日期转成字符串,通过正则判断是否是8位数字,拆分后拼接成横杠分隔的格式;其他格式直接把斜杠替换成横杠,最后统一转换为日期类型,NULL值同样保留。
内容的提问来源于stack exchange,提问作者Ritesh Chandra
相关产品推荐
相关产品推荐

