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

PySpark解析带微秒的时间戳字符串并转换为带小数的Unix时间戳

解决PySpark解析带微秒与时区的时间戳返回null问题

问题根源

你的格式字符串和输入时间戳不匹配,导致解析失败返回null:

  • 输入的时区是+01:00(ISO 8601格式,带冒号),但你使用的Z对应RFC 822时区格式(不带冒号,如+0100)
  • 虽然小数部分用SSSSS能匹配5位微秒,但时区不匹配是核心问题

分步解决方案

1. 正确解析时间戳字符串

将格式字符串中的Z替换为XXX(专门匹配带冒号的ISO 8601时区),重新解析:

import pyspark.sql.functions as f

# 替换原列名为你的实际列名,比如原列叫raw_ts
df = df.withColumn("timestamp", f.to_timestamp("raw_ts", "yyyy-MM-dd'T'HH:mm:ss.SSSSSXXX"))

执行后,timestamp列会正确存储包含微秒的时间戳数据。

2. 生成带微秒的Unix时间戳

要得到以秒为单位、保留微秒精度的Unix时间戳,有两种可靠方式:

方式一:类型转换计算

Spark的Timestamp类型内部以微秒数存储,将其转为Double类型后除以1e6即可:

df = df.withColumn("unix_ts_micros", f.col("timestamp").cast("double") / 1000000)

方式二:拆分秒与微秒相加

通过unix_timestamp获取整数秒数,microsecond提取微秒部分,再合并:

df = df.withColumn(
    "unix_ts_micros",
    f.unix_timestamp("timestamp") + f.microsecond("timestamp") / 1000000
)

完整测试示例

import pyspark.sql.functions as f

# 模拟测试数据
test_data = [("2023-11-17T08:28:40.71910 +01:00",)]
df = spark.createDataFrame(test_data, ["raw_ts"])

# 解析时间戳
df = df.withColumn("timestamp", f.to_timestamp("raw_ts", "yyyy-MM-dd'T'HH:mm:ss.SSSSSXXX"))

# 生成带微秒的Unix时间戳
df = df.withColumn("unix_ts_micros", f.col("timestamp").cast("double") / 1000000)

# 查看结果
df.show(truncate=False)

输出结果中,timestamp列会显示正确的时间值,unix_ts_micros列则会给出类似1700220520.7191的带微秒的Unix时间戳。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:23:29