PySpark中字符串转Timestamp返回None的问题求解
PySpark字符串转Timestamp(UTC优先)解决方案
问题根源
转换后出现None主要有两个核心原因:
- 列名大小写不匹配:你的DataFrame列名是
Time1/Time2(首字母大写),但代码中用了小写的time1/time2,导致无法匹配目标列。 - 时间格式字符串不匹配:
Time2的时区格式是±HH:mm,对应的格式符不是Z(Z对应±HHmm格式),需要用XXX来匹配带冒号的时区偏移。
修正后的代码
1. 处理Time1(带微秒的时间转UTC)
Time1无时区信息,默认按Session时区解析,要转为UTC需先解析再转换时区:
from pyspark.sql import functions as F # 覆盖原列:解析Time1为Timestamp,再转UTC mydataframe = mydataframe.withColumn( "Time1", F.to_utc_timestamp(F.to_timestamp(F.col("Time1"), "yyyy-MM-dd HH:mm:ss.SSSSSS"), "UTC") )
2. 处理Time2(带时区偏移的时间转UTC)
Time2自带时区偏移,用正确格式符解析后转UTC:
# 覆盖原列:匹配±HH:mm时区格式解析,再转UTC mydataframe = mydataframe.withColumn( "Time2", F.to_utc_timestamp(F.to_timestamp(F.col("Time2"), "yyyy-MM-dd HH:mm:ssXXX"), "UTC") )
完整执行示例
from pyspark.sql import functions as F # 批量处理两列 mydataframe = mydataframe \ .withColumn("Time1", F.to_utc_timestamp(F.to_timestamp(F.col("Time1"), "yyyy-MM-dd HH:mm:ss.SSSSSS"), "UTC")) \ .withColumn("Time2", F.to_utc_timestamp(F.to_timestamp(F.col("Time2"), "yyyy-MM-dd HH:mm:ssXXX"), "UTC"))
验证效果
执行后,原字符串列会被替换为UTC时区的Timestamp类型,不会再出现None值。例如原Time2值2022-04-23 17:30:22-07:00会被转为UTC时间2022-04-24 00:30:22。
内容的提问来源于stack exchange,提问作者jumpman8947
相关产品推荐
相关产品推荐

