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

如何在PySpark中使用正则修复格式异常的时间戳列?

修复PySpark中的时间戳字符串格式并转换

问题分析

原字符串2022-12-07050641的结构是yyyy-MM-ddHHmmss(日期与时间连在一起,时间部分无分隔符),Spark的to_timestamp()无法自动识别这种非标准格式,因此返回null。我们可以通过正则表达式调整其结构为带分隔符的标准格式,再完成转换。

正则修复方案

通过正则分组匹配日期、时、分、秒各部分,插入空格、冒号分隔符,并补充毫秒部分(原数据无毫秒,补.000),最终得到yyyy-MM-dd HH:mm:ss.SSS格式的字符串。

具体实现代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import regexp_replace, to_timestamp, date_format

# 初始化Spark会话
spark = SparkSession.builder.appName("TimestampConversion").getOrCreate()

# 测试数据
sample_data = [("2022-12-07050641",)]
df = spark.createDataFrame(sample_data, ["raw_ts"])

# 用正则修复字符串格式
df = df.withColumn(
    "fixed_str_ts",
    regexp_replace(
        "raw_ts",
        r"^(\d{4}-\d{2}-\d{2})(\d{2})(\d{2})(\d{2})$",
        "$1 $2:$3:$4.000"
    )
)

# 转换为Spark Timestamp类型(可选)
df = df.withColumn(
    "standard_ts",
    to_timestamp("fixed_str_ts", "yyyy-MM-dd HH:mm:ss.SSS")
)

# 若需将Timestamp转回指定格式的字符串,使用date_format
df = df.withColumn(
    "final_str_ts",
    date_format("standard_ts", "yyyy-MM-dd HH:mm:ss.SSS")
)

df.show(truncate=False)

正则表达式说明

  • ^(\d{4}-\d{2}-\d{2}):匹配开头的日期部分(如2022-12-07),作为第1组
  • (\d{2}):匹配接下来的2位小时数(如05),第2组
  • (\d{2}):匹配2位分钟数(如06),第3组
  • (\d{2})$:匹配最后2位秒数(如41),第4组
  • 替换模板$1 $2:$3:$4.000:将分组内容按标准格式拼接,补全毫秒部分

补充方案:直接指定原格式转换

如果不需要修改字符串格式,仅需转换为Timestamp类型,也可以直接给to_timestamp()指定原字符串的格式:

df = df.withColumn(
    "standard_ts",
    to_timestamp("raw_ts", "yyyy-MM-ddHHmmss")
)
# 再转成目标字符串格式
df = df.withColumn(
    "final_str_ts",
    date_format("standard_ts", "yyyy-MM-dd HH:mm:ss.SSS")
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:24