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

如何为PySpark DataFrame按id1组补全年周格式缺失日期?

解决PySpark中年周格式日期的补全问题

针对yyyy-Www这种年周格式的日期补全,核心是先将字符串格式的年周转换为可计算的日期类型,生成完整周序列后再转回原格式,最后与原表关联补全数据。以下是完整实现步骤:

1. 导入依赖

from pyspark.sql import functions as F

2. 将年周字符串转为日期类型

先把date列的yyyy-Www格式字符串转换成实际日期(这里默认以每周周一作为周的起始日,若需周日可调整格式参数):

df_with_date = df.withColumn(
    "week_date",
    F.to_date(F.col("date"), "yyyy-'W'ww")
)

3. 生成每个id1的完整周序列

按id1分组获取该用户的最小和最大周日期,再生成中间所有周的序列,最后转回yyyy-Www格式:

# 获取每个id1的日期范围
id_date_range = df_with_date.groupBy("id1").agg(
    F.min("week_date").alias("min_week"),
    F.max("week_date").alias("max_week")
)

# 生成完整周序列并转回原格式
full_dates = id_date_range.withColumn(
    "week_date",
    F.explode(F.sequence(F.col("min_week"), F.col("max_week"), F.expr("interval 1 week")))
).withColumn(
    "date",
    F.date_format(F.col("week_date"), "yyyy-'W'ww")
).drop("min_week", "max_week")

4. 左连接原表补全数据

将生成的完整周序列与原DataFrame左连接,缺失的字段会自动填充为null:

result = full_dates.join(
    df,
    on=["id1", "date"],
    how="left"
).drop("week_date").orderBy("id1", "date")

关键说明

  • 日期转换格式:yyyy-'W'ww是Spark解析2022-W01这类字符串的标准格式,若你的年周以周日为起始,可调整为yyyy-'W'ww-u(其中u=7代表周日),具体可根据Spark版本测试调整。
  • 序列生成:sequence函数仅支持日期/数值类型,因此必须先转换为日期才能生成连续周序列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:15:36