如何在PySpark中转换Databricks里的Datetime格式以适配API要求?
解决PySpark中Datetime字段格式转换问题
要将格式为2022-07-06 16:43:18.696 +0100的Datetime字段转换为2022-07-06T16:43:18.8000000+00:0格式(UTC时区、7位秒小数、T分隔符),可以通过以下PySpark步骤实现:
方法一(Spark 3.0+推荐)
利用to_timestamp_tz解析带时区的时间字符串,转换到UTC后格式化,再调整时区标识:
from pyspark.sql import functions as F # 假设数据框名为df,原始时间字段名为original_datetime df = df.withColumn( "target_datetime", F.regexp_replace( # 解析原始时间为带时区类型,转UTC后按指定格式输出 F.date_format( F.to_timestamp_tz(F.col("original_datetime"), "yyyy-MM-dd HH:mm:ss.SSS Z").at_timezone("UTC"), "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX" ), # 将标准UTC时区标识+00:00替换为目标格式的+00:0 r"\+00:00", "+00:0" ) )
方法二(兼容旧版本Spark)
如果使用Spark 3.0以下版本,可通过to_timestamp结合to_utc_timestamp实现:
from pyspark.sql import functions as F df = df.withColumn( "utc_timestamp", # 先解析原始时间,再转换到UTC时区 F.to_utc_timestamp(F.to_timestamp(F.col("original_datetime"), "yyyy-MM-dd HH:mm:ss.SSS Z"), "UTC") ).withColumn( "target_datetime", F.concat( # 格式化日期时间部分到6位秒小数 F.date_format(F.col("utc_timestamp"), "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"), # 补第7位零,拼接目标时区标识 F.lit("0+00:0") ) )
关键说明
- 原始时间格式
yyyy-MM-dd HH:mm:ss.SSS Z中,Z对应时区偏移(如+0100),确保解析时格式符完全匹配。 - 目标格式的7位秒小数:Spark的
date_format中SSSSSSS会自动将3位毫秒补零到7位(如.696变为.6960000)。 - 时区转换:必须将原始时间转换为UTC时区,再生成目标格式的时区标识
+00:0。
内容的提问来源于stack exchange,提问作者JGW
相关产品推荐
相关产品推荐

