PySpark从字符串列提取日期时间字段返回Null的问题求助
解决PySpark中自定义格式日期字符串提取字段返回Null的问题
你的问题核心是Spark默认的时间解析格式不匹配你的日期字符串格式,直接cast为Timestamp会失败,导致后续year/month等函数返回Null。以下是具体解决步骤:
关键原因
你的日期字符串格式为Wed, 09/29/10 03:52 PM,包含星期缩写、两位年份、12小时制时间,Spark默认的Timestamp解析规则无法识别这种格式,必须手动指定匹配的格式模板。
解决方案代码
from pyspark.sql import SparkSession from pyspark.sql.functions import to_timestamp, year, month, dayofmonth, dayofweek, hour # 初始化SparkSession spark = SparkSession.builder.appName("DateExtract").getOrCreate() # 测试数据 data = [("Wed, 09/29/10 03:52 PM",)] df = spark.createDataFrame(data, ["Mailed Date"]) # 第一步:将字符串解析为Timestamp类型,指定匹配格式 # 格式说明: # EEE = 星期缩写(如Wed) # MM = 两位月份(09) # dd = 两位日期(29) # yy = 两位年份(10) # hh = 12小时制小时(03) # mm = 两位分钟(52) # a = AM/PM标识 df = df.withColumn( "mailed_timestamp", to_timestamp("Mailed Date", "EEE, MM/dd/yy hh:mm a") ) # 第二步:提取所需字段 df = df.withColumn("year", year("mailed_timestamp")) \ .withColumn("month", month("mailed_timestamp")) \ .withColumn("day", dayofmonth("mailed_timestamp")) \ .withColumn("day_of_week", dayofweek("mailed_timestamp")) \ .withColumn("hour_24", hour("mailed_timestamp")) # 自动转换为24小时制 # 查看结果 df.show(truncate=False)
结果说明
dayofweek返回值范围是1(周日)到7(周六),如果需要星期名称,可以用date_format("mailed_timestamp", "EEEE")获取完整星期名,或EEE获取缩写- 两位年份
yy会被Spark默认解析为20xx(如10→2010),如果需要指定为19xx,可以后续手动调整年份 - 解析后的
hour_24会自动将PM时间转换为24小时制(如03 PM→15)
常见注意事项
- 格式字符串的大小写必须严格匹配:比如
MM是月份,mm是分钟;hh是12小时制,HH是24小时制 - 如果数据中存在格式不一致的记录,解析后会返回Null,可以用
isnull函数过滤或处理异常数据
内容的提问来源于stack exchange,提问作者vish
相关产品推荐
相关产品推荐

