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

PySpark技术求助:通过切片从日期字符串提取年份报错

解决PySpark中提取日期字符串年份的问题

嘿,我来帮你搞定这个问题!你遇到的问题根源在于:PySpark的Column对象不支持Python原生的字符串切片语法。你写的df.Date[-4:]是Python处理普通字符串的方式,但df.Date返回的是PySpark的Column类型,得用PySpark专门的字符串函数来处理。

下面给你两种可行的解决方案,第二种更推荐:

方案1:直接对字符串进行子串提取

用PySpark的substring函数,指定从倒数第4位开始截取4个字符,就能拿到年份:

from pyspark.sql.functions import substring

# 初始化数据框
df = sqlContext.createDataFrame([("12/12/1980", 1, 2)], ("Date", "Num", "#"))
# 添加年份列:从Date字段的倒数第4位开始,取4个字符
df = df.withColumn("Year", substring(df.Date, -4, 4))
# 查看结果
df.show()

你也可以用expr函数写SQL风格的表达式,效果一样:

from pyspark.sql.functions import expr

df = df.withColumn("Year", expr("substring(Date, -4, 4)"))

方案2:转成日期类型后提取年份(更推荐)

如果你的日期字符串格式是固定的(比如这里的MM/dd/yyyy),更规范的做法是先把字符串转成PySpark的日期类型,再用year函数提取年份。这种方法的好处是能自动处理日期格式的小变化(比如单数字的月/日,像1/5/2023),还能验证日期的合法性(无效日期会返回null,方便后续排查):

from pyspark.sql.functions import to_date, year

# 初始化数据框
df = sqlContext.createDataFrame([("12/12/1980", 1, 2)], ("Date", "Num", "#"))
# 将字符串转成日期类型,指定格式为MM/dd/yyyy
df = df.withColumn("Date_Type", to_date(df.Date, "MM/dd/yyyy"))
# 从日期类型字段提取年份
df = df.withColumn("Year", year(df.Date_Type))
# 查看结果
df.show()

运行上面的代码后,你就能成功提取到年份啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:43