我拥有多年的数据,并且想使用date
列添加一个额外的列,该列可容纳这些年中的星期数,这些年递增。
我知道weekofyear()
,但是我想采用最低的绑定日期并递增地计算周数。
ie:两年的数据将包含week_number
列中介于1到104(周)之间的数据。
答案 0 :(得分:1)
如果您不在乎ISO周,则只需在偏移量和行之间除以7天。例如,
df.show(10, False)
+----------+---+
|date |val|
+----------+---+
|2019-01-01|124|
|2019-01-06|234|
|2019-01-08|23 |
|2020-01-01|125|
|2020-07-01|123|
|2020-07-08|11 |
|2020-07-15|5 |
|2020-07-22|12 |
+----------+---+
然后
import pyspark.sql.functions as f
from pyspark.sql import Window
w1 = Window.orderBy('date')
w2 = Window.orderBy('weeks').rangeBetween(-3, 0) # last 4 weeks
df.withColumn('datediff', f.datediff('date', f.first('date').over(w1))) \
.withColumn('weeks', (f.col('datediff') / 7).cast('int') + 1) \
.withColumn('avg', f.avg('val').over(w2)) \
.show(10, False)
+----------+---+--------+-----+------------------+
|date |val|datediff|weeks|avg |
+----------+---+--------+-----+------------------+
|2019-01-01|124|0 |1 |179.0 |
|2019-01-06|234|5 |1 |179.0 |
|2019-01-08|23 |7 |2 |127.0 |
|2020-01-01|125|365 |53 |125.0 |
|2020-07-01|123|547 |79 |123.0 |
|2020-07-08|11 |554 |80 |67.0 |
|2020-07-15|5 |561 |81 |46.333333333333336|
|2020-07-22|12 |568 |82 |37.75 |
+----------+---+--------+-----+------------------+