在pyspark中跨年递增地将日期转换为周数(滚动平均)

3b6akqbq  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(438)

我有多年的数据,想使用 date 列以添加一个附加列,该列保存周数,并随年份递增。
我知道 weekofyear() ,但我想取最低限制日期并以增量方式计算周数。
ie:两年的数据将包含 week_number 列1到104(周)。
在spark中最好的方法是什么?这是一个尝试,在一个滚动平均每周。
另外,有没有更好的方法来应用spark中从日期栏开始的最后n周的滚动平均值(每周计算)

ioekq8ef

ioekq8ef1#

如果您不关心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             |
+----------+---+--------+-----+------------------+

相关问题