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

PySpark修改日期列日值为23日时change_day导入报错解决

问题原因

pyspark.sql.functions 模块不存在内置的change_day方法,直接调用会触发导入报错。你的业务需求本质是保留原日期列的年、月维度值,将日维度固定替换为23,不需要依赖不存在的change_day方法,用PySpark原生日期函数即可实现。

实现方案

方案1:推荐通用方案(全版本兼容,逻辑直观)

通过year、month函数提取原日期的年、月值,搭配make_date直接拼接年、月、固定日23生成目标日期,不会出现跨月、跨年偏移问题:

import pyspark.sql.functions as sf

jsonDF2 = jsonDF2.withColumn(
    "periodEndDate",
    sf.make_date(
        sf.year("periodDate"),
        sf.month("periodDate"),
        sf.lit(23)
    )
)

如果你的periodDate列是字符串类型而非日期类型,先转换为日期类型再做拼接即可:

# 替换to_date的第二个参数为你实际的日期格式,例如yyyy/MM/dd、yyyyMMdd等
jsonDF2 = jsonDF2.withColumn(
    "periodEndDate",
    sf.make_date(
        sf.year(sf.to_date("periodDate", "yyyy-MM-dd")),
        sf.month(sf.to_date("periodDate", "yyyy-MM-dd")),
        sf.lit(23)
    )
)

方案2:偏移计算方案(无make_date的低版本PySpark适用)

先将原日期截断到当月第一天,再加22天得到当月23日,不需要拆分年、月字段:

import pyspark.sql.functions as sf

jsonDF2 = jsonDF2.withColumn(
    "periodEndDate",
    sf.date_trunc("month", "periodDate").cast("date") + sf.expr("interval 22 days")
)
校验说明

两种方案生成的periodEndDate均为日期类型,无论原periodDate存储的是当月哪一天(包括你提到的每月最后一天),输出结果都是对应月份的23日,完全匹配业务规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:18:26