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
相关产品推荐
相关产品推荐

