如何在PySpark中将指定格式的日期字符串转换为timestamp类型
PySpark日期字符串转Timestamp的解决方案
你返回null的核心原因是指定的时间格式模板和实际输入的字符串格式不匹配:你输入的'06/21/2021 9:27 AM'中分钟后没有秒数,但你使用的格式串MM/dd/yyyy hh:mm:ss a多了秒的占位符ss,导致解析失败返回null。
解决方案
写法1:修正原有逻辑的格式串
把格式串中的ss删除,调整为MM/dd/yyyy h:mm a即可正常解析:
from pyspark.sql.functions import unix_timestamp, from_unixtime from pyspark.sql.types import TimestampType df = df.select( from_unixtime(unix_timestamp('date_string', 'MM/dd/yyyy h:mm a')).cast(TimestampType()).alias("date_timestamp") )
写法2(更推荐):直接使用to_timestamp函数
PySpark 2.2及以上版本可以直接用to_timestamp完成转换,不需要两层函数嵌套,代码更简洁高效:
from pyspark.sql.functions import to_timestamp df = df.select( to_timestamp('date_string', 'MM/dd/yyyy h:mm a').alias("date_timestamp") )
补充说明
如果输入的小时可能出现两位格式(例如06/21/2021 09:27 AM),把格式串调整为MM/dd/yyyy hh:mm a即可同时兼容一位、两位的12小时制小时数值。
你可以用以下测试代码验证效果:
from pyspark.sql import SparkSession from pyspark.sql.functions import to_timestamp # 初始化SparkSession spark = SparkSession.builder.appName("date_convert_test").getOrCreate() # 构造测试数据集 test_df = spark.createDataFrame([("06/21/2021 9:27 AM",)], ["date_string"]) # 执行转换并打印结果 test_df.select( to_timestamp("date_string", "MM/dd/yyyy h:mm a").alias("date_timestamp") ).show(truncate=False)
正常输出结果如下:
+-------------------+ |date_timestamp | +-------------------+ |2021-06-21 09:27:00| +-------------------+
内容的提问来源于stack exchange,提问作者Prasoon
相关产品推荐
相关产品推荐

