如何配置PySpark将周日设为一周的起始日?
解决PySpark周起始日统一为周日的问题
PySpark的weekOfYear()函数基于ISO 8601标准实现,固定以周一作为一周的起始日,没有全局配置项可以直接修改这个行为。但你不需要编写自定义函数,通过内置函数的组合就能实现以周日为起始的周数计算,同时和dayOfWeek()的逻辑匹配。
实现方案
1. 通用方案(适配所有Spark版本)
将目标日期加1天后再调用weekOfYear(),这样原本属于周日的日期会被归入下一周的周一统计,等效于把周日作为新一周的起始:
from pyspark.sql.functions import weekofyear, date_add # 计算以周日为起始的周数 df = df.withColumn("week_of_year_sun_start", weekofyear(date_add("your_date_column", 1)))
这个逻辑和dayOfWeek()的行为天然匹配——dayOfWeek()返回1代表周日,正好对应新一周的开始。
2. Spark 3.5+专属方案
Spark 3.5.0及以上版本的date_trunc()函数新增了weekStart参数,允许直接指定周起始日(7代表周日)。你可以先获取以周日为起始的周起始时间,再基于此计算周数:
from pyspark.sql.functions import date_trunc, weekofyear, date_add # 获取以周日为起始的周的第一天 df = df.withColumn("week_start_sunday", date_trunc("week", "your_date_column", weekStart=7)) # 基于周起始日计算周数(加1天适配weekOfYear的ISO标准) df = df.withColumn("week_of_year_sun_start", weekofyear(date_add("week_start_sunday", 1)))
说明
dayOfWeek()函数默认就是以周日为1、周六为7,所以上述两种方案计算出的周数和dayOfWeek()的逻辑完全统一,满足你计算周环比、去年同期数据的需求。- 不需要修改任何全局配置,仅通过内置函数组合即可实现需求,避免自定义函数带来的维护成本。
内容的提问来源于stack exchange,提问作者Shane McGarry
相关产品推荐
相关产品推荐

