PySpark:将YearWeek与Day字段转换为日期值
解决Databricks PySpark中YearWeek+Day转日期的问题
直接用PySpark内置函数就能搞定,不用Python本地的strptime(它没法直接在withColumn里用,除非写UDF但效率低),也能避免date_add返回错误数据的问题,步骤如下:
核心思路
- 把
YearWeek(比如2417)转换成yyyy-Www格式的字符串(比如2024-W17),用PySpark的to_date函数解析成该周的起始日期(ISO标准下是周一)。 - 用
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
相关产品推荐
相关产品推荐

