PySpark中处理多种日期格式问题求助
PySpark 多日期格式解析问题解决
问题背景
我尝试用PySpark处理多种日期数据格式,但使用to_timestamp函数后未得到预期输出。以下是输入数据及尝试的代码:
输入数据
input_data = [ "2021-06-16T13:24:44.240-05:00", "2011-10-20-05:00", "1982-09-27-06:00", "20/11/2021" ]
尝试的代码
from pyspark.sql import functions as F from pyspark.sql.functions import col # 创建DataFrame df = spark.createDataFrame([(i,) for i in input_data], ["input"]) # 转换日期 dfWithDate = df.withColumn("output", F.to_date(F.to_timestamp(col("input"), "M/d/yyyy H:mm"))) dfWithDate.show()
问题原因
你仅为to_timestamp指定了单一格式"M/d/yyyy H:mm",但输入数据包含4种不同的日期格式,只有完全匹配该格式的字符串能被正确解析,其余都会返回null,最终to_date也会得到null。
解决方案
使用coalesce函数依次尝试多种日期格式,只要某一种格式解析成功就返回对应时间戳,再转换为日期。针对输入数据的每种格式,对应的解析模式如下:
"2021-06-16T13:24:44.240-05:00"→"yyyy-MM-dd'T'HH:mm:ss.SSSXXX""2011-10-20-05:00"/"1982-09-27-06:00"→"yyyy-MM-ddXXX""20/11/2021"→"dd/MM/yyyy"
修改后的代码:
from pyspark.sql import functions as F from pyspark.sql.functions import col input_data = [ "2021-06-16T13:24:44.240-05:00", "2011-10-20-05:00", "1982-09-27-06:00", "20/11/2021" ] df = spark.createDataFrame([(i,) for i in input_data], ["input"]) dfWithDate = df.withColumn( "output", F.to_date( F.coalesce( F.to_timestamp(col("input"), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), F.to_timestamp(col("input"), "yyyy-MM-ddXXX"), F.to_timestamp(col("input"), "dd/MM/yyyy") ) ) ) dfWithDate.show()
运行结果
+-------------------------------+----------+ |input |output | +-------------------------------+----------+ |2021-06-16T13:24:44.240-05:00 |2021-06-16| |2011-10-20-05:00 |2011-10-20| |1982-09-27-06:00 |1982-09-27| |20/11/2021 |2021-11-20| +-------------------------------+----------+
内容的提问来源于stack exchange,提问作者Villa
相关产品推荐
相关产品推荐

