You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:18:21