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

PySpark:将YearWeek与Day字段转换为日期值

解决Databricks PySpark中YearWeek+Day转日期的问题

直接用PySpark内置函数就能搞定,不用Python本地的strptime(它没法直接在withColumn里用,除非写UDF但效率低),也能避免date_add返回错误数据的问题,步骤如下:

核心思路

  1. 把YearWeek(比如2417)转换成yyyy-Www格式的字符串(比如2024-W17),用PySpark的to_date函数解析成该周的起始日期(ISO标准下是周一)。
  2. 用date_add函数给起始日期加上Day列的偏移量,得到目标日期。

代码示例

先创建测试DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, lit, concat, to_date, date_add

spark = SparkSession.builder.getOrCreate()

# 测试数据
data = [("2417", 0), ("2417", 1), ("2417", 5)]
df = spark.createDataFrame(data, ["YearWeek", "Day"])
df.show()

转换并新增日期列:

# 生成周起始日期(ISO周,周一为起始日)
df_result = df.withColumn(
    "Week_Start_Date",
    to_date(
        concat(lit("20"), col("YearWeek").substr(1,2), lit("-W"), col("YearWeek").substr(3,2)),
        "yyyy-'W'ww"
    )
).withColumn(
    "Target_Date",
    date_add(col("Week_Start_Date"), col("Day"))
)

df_result.show()

调整说明

如果你的Day=0对应的是周日而非周一,只需要把周起始日期往前推1天,再加上Day偏移:

df_result = df.withColumn(
    "Week_Start_Date",
    date_add(
        to_date(
            concat(lit("20"), col("YearWeek").substr(1,2), lit("-W"), col("YearWeek").substr(3,2)),
            "yyyy-'W'ww"
        ),
        -1  # 把周一改成周日作为起始
    )
).withColumn(
    "Target_Date",
    date_add(col("Week_Start_Date"), col("Day"))
)

为什么之前的方法不行?

  • date_add返回错误:大概率是你没正确把YearWeek转换成合法的起始日期,导致偏移计算错误。
  • strptime无法在withColumn使用:因为它是Python本地函数,PySpark的withColumn只支持分布式执行的内置函数或注册的UDF(但UDF效率远低于内置函数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:55:01