标记pyspark中两个日期之间的所有数据点



有人给了我一张表,上面附有销售和促销数据。

当条目中填写了促销数据时,则表示促销活动于当天开始,并将在promo_end_date结束。

下面是一个例子:

<表类> 日期 promo_end_date 销售 item_id promo_id tbody><<tr>1.1.20203.1.2020112.1.2020空11空3.1.2020空11空4.1.2020空11空5.1.20206.1.202011B6.1.2020空11空1.1.2020空12空2.1.2020空12空3.1.2020空12空4.1.20206.1.202012C5.1.2020空12空6.1.2020空12空

您可以使用lastignorenulls=True获得最近的promo_end_date,然后将日期与promo_end_date进行比较,以了解当前是否有促销活动:

from pyspark.sql import functions as F, Window
df2 = df.withColumn(
'date', F.to_date('date', 'd.M.yyyy')
).withColumn(
'promo_end_date', F.to_date('promo_end_date', 'd.M.yyyy')
).withColumn(
'promo_end_date',
F.last('promo_end_date', ignorenulls=True).over(Window.partitionBy('item_id').orderBy('date'))
).withColumn(
'on_promo', F.when(F.col('date') <= F.col('promo_end_date'), 1).otherwise(0)
)
df2.show()
+----------+--------------+-----+-------+--------+--------+
|      date|promo_end_date|sales|item_id|promo_id|on_promo|
+----------+--------------+-----+-------+--------+--------+
|2020-01-01|    2020-01-03|    1|      1|       A|       1|
|2020-01-02|    2020-01-03|    1|      1|    null|       1|
|2020-01-03|    2020-01-03|    1|      1|    null|       1|
|2020-01-04|    2020-01-03|    1|      1|    null|       0|
|2020-01-05|    2020-01-06|    1|      1|       B|       1|
|2020-01-06|    2020-01-06|    1|      1|    null|       1|
|2020-01-01|          null|    1|      2|    null|       0|
|2020-01-02|          null|    1|      2|    null|       0|
|2020-01-03|          null|    1|      2|    null|       0|
|2020-01-04|    2020-01-06|    1|      2|       C|       1|
|2020-01-05|    2020-01-06|    1|      2|    null|       1|
|2020-01-06|    2020-01-06|    1|      2|    null|       1|
+----------+--------------+-----+-------+--------+--------+

最新更新