逐年将pyspark中的日期转换为周数(滚动平均值)

时间:2020-08-17 21:56:43

标签: apache-spark pyspark

我拥有多年的数据,并且想使用date列添加一个额外的列,该列可容纳这些年中的星期数,这些年递增。

我知道weekofyear(),但是我想采用最低的绑定日期并递增地计算周数。

ie:两年的数据将包含week_number列中介于1到104(周)之间的数据。

  1. 在火花中做到这一点的最佳方法是什么?这是尝试每周平均滚动一周。
  2. 还有什么更好的方法可以在Spark中从日期列开始的最近n周内应用滚动平均值? (每周计算)

1 个答案:

答案 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             |
+----------+---+--------+-----+------------------+