如何为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
相关产品推荐
相关产品推荐

