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

PySpark将带英文月份的字符串日期时间转时间戳返回null问题

问题根因

三种写法全部返回null的核心原因是日期格式不匹配:

  • cast("timestamp")和不带格式参数的f.to_timestamp(),默认仅支持解析yyyy-MM-dd HH:mm:ss格式的时间字符串(例:2022-06-30 14:00:00)
  • 你的输入字符串格式为dd-MMM-yyyy HH:mm:ss(日-三位英文月份缩写-年 时:分:秒),和默认解析规则完全不符,解析失败就会返回null值。
修复方案

调用f.to_timestamp()时传入第二个参数,明确指定输入字符串对应的日期格式模板即可。
完整可运行代码:

from pyspark.sql import functions as f
from pyspark.sql.types import StructType, StructField, StringType

# 测试数据
data = [
    ("30-Jun-2022 14:00:00",),
    ("25-Jul-2022 11:00:00",),
    ("10-May-2022 12:00:00",),
    ("11-Jan-2022 09:00:00",)
]

schema = StructType([
    StructField("date_string", StringType(), True)
])

df = spark.createDataFrame(data=data, schema=schema)

# 带格式参数的时间转换
df = df.withColumn(
    "parsed_timestamp",
    f.to_timestamp(f.col("date_string"), "dd-MMM-yyyy HH:mm:ss")
)

df.show(truncate=False)

运行输出:

+---------------------+-------------------+
|date_string          |parsed_timestamp   |
+---------------------+-------------------+
|30-Jun-2022 14:00:00|2022-06-30 14:00:00|
|25-Jul-2022 11:00:00|2022-07-25 11:00:00|
|10-May-2022 12:00:00|2022-05-10 12:00:00|
|11-Jan-2022 09:00:00|2022-01-11 09:00:00|
+---------------------+-------------------+
补充说明
  • 用到的格式符对应含义:dd代表两位日期、MMM代表三位英文缩写月份、yyyy代表四位年份、HH代表24小时制小时、mm代表分钟、ss代表秒。
  • 如果运行时出现英文月份无法识别的问题,可以先执行spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")调整时间解析策略,再运行转换逻辑。

注意:你提供的最小可复现示例本身存在语法问题:单元素元组末尾必须加逗号,否则Python会把括号内的内容识别为普通字符串而非元组,创建DataFrame时会报结构不匹配错误,正确写法为("30-Jun-2022 14:00:00",)。

内容的提问来源于stack exchange,提问作者OdiumPura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:45:42