如何在PySpark DataFrame列中替换字符串前两个空格为连字符
PySpark替换日期字符串前两个空格为连字符(保留部分日期)
方法1:按最后一个空格分割处理
这种方法先将字符串按最后一个空格拆分为日期部分和时间部分,再将日期部分内的所有空格替换为连字符,最后拼接回原格式。能精准区分日期和时间区域,避免误替换时间前的空格,适配你的场景需求。
代码示例:
from pyspark.sql import functions as F # 拆分字符串为日期部分和时间部分(仅按最后一个空格分割) df = df.withColumn("split_parts", F.split(F.col("DTC"), " ", 2)) # 处理有时间部分的行:替换日期部分的空格为-,再拼接时间 df = df.withColumn( "DTC", F.when( F.size(F.col("split_parts")) == 2, F.concat( F.regexp_replace(F.col("split_parts")[0], " ", "-"), F.lit(" "), F.col("split_parts")[1] ) ).otherwise(F.col("DTC")) # 无时间部分的行保留原内容 ).drop("split_parts")
方法2:按空格分割数组后拼接
这种方法将字符串按所有空格拆分为数组,根据数组长度判断日期部分的元素数量,再将日期元素用连字符连接,最后拼接时间部分。适合需要明确控制日期元素数量的场景。
代码示例:
from pyspark.sql import functions as F # 按所有空格拆分字符串为数组 df = df.withColumn("dtc_array", F.split(F.col("DTC"), " ")) # 根据数组长度分别处理 df = df.withColumn( "DTC", F.when( F.size(F.col("dtc_array")) == 4, # 格式:日 月 年 时间 F.concat( F.concat_ws("-", F.col("dtc_array")[0], F.col("dtc_array")[1], F.col("dtc_array")[2]), F.lit(" "), F.col("dtc_array")[3] ) ).when( F.size(F.col("dtc_array")) == 3, # 格式:月 年 时间 F.concat( F.concat_ws("-", F.col("dtc_array")[0], F.col("dtc_array")[1]), F.lit(" "), F.col("dtc_array")[2] ) ).otherwise(F.col("DTC")) # 其他格式保留原内容 ).drop("dtc_array")
说明
两种方法都不会将字符串转换为日期类型,因此不会丢失无法解析的部分日期数据。方法1更通用,无论日期部分包含1个还是2个空格都能处理;方法2则更精准,可针对不同的日期元素数量做定制化处理。
内容的提问来源于stack exchange,提问作者Vikas Garud
相关产品推荐
相关产品推荐

