python - Pyspark:仅在每个日期的特定小时和分钟内向前填充
问题描述
如何仅在日期时间戳为 00:00:00 的情况下进行前向填充?
对于每date
一个有一个00:00:00
将有一个空,因为传感器不能正常工作。其他时候会有空值,需要保留它们。
+---+-------------------+-----+
| id| date|value|
+---+-------------------+-----+
| A1|2016-09-30 23:00:00| 3|
| A1|2016-10-01 00:00:00| Null|
| A1|2016-10-01 01:00:00| 1|
| A1|2016-10-01 02:30:30| 3|
| A9|2016-10-05 23:00:00| 3|
| A9|2016-10-06 00:00:00| Null|
| A9|2016-10-06 02:20:00| 4|
| A9|2016-10-06 03:20:00| Null|
+---+-------------------+-----+
所需的数据框:
+---+-------------------+-----+
| id| date|value|
+---+-------------------+-----+
| A1|2016-09-30 23:00:00| 3|
| A1|2016-10-01 00:00:00| 3|
| A1|2016-10-01 01:00:00| 1|
| A1|2016-10-01 02:30:30| 3|
| A9|2016-10-05 23:00:00| 3|
| A9|2016-10-06 00:00:00| 3|
| A9|2016-10-06 02:20:00| 4|
| A9|2016-10-06 03:20:00| Null|
+---+-------------------+-----+
解决方案
您可以使用lag
功能:
from pyspark.sql import functions as F
from pyspark.sql.functions import *
from pyspark.sql.window import Window
w=Window().partitionBy("id").orderBy("date")
df.withColumn("value", F.when(col("date").like("%00:00:00"), \
F.lag("value").over(w)).otherwise(col("value"))).show()
+---+-------------------+-----+
| id| date|value|
+---+-------------------+-----+
| A1|2016-09-30 23:00:00| 3|
| A1|2016-10-01 00:00:00| 3|
| A1|2016-10-01 01:00:00| 1|
| A1|2016-10-01 02:30:30| 3|
| A9|2016-10-05 23:00:00| 3|
| A9|2016-10-06 00:00:00| 3|
| A9|2016-10-06 02:20:00| 4|
| A9|2016-10-06 03:20:00| null|
+---+-------------------+-----+
推荐阅读
- jwt - 在 Keycloak 令牌中包含组(连同角色)?
- r - 无法将类型“闭包”强制转换为“字符”类型的向量 rgl 包
- database - 如何从 Data Lake Storage Gen 1 将数据导入 Azure SQL 数据库?
- python - 为什么在 Python 中操作另一个列表会影响列表的新副本?
- android - android,如何在应用端生成较短版本的 uuid(13 个字符)
- excel - Finding a more efficient way of using SUM PRODUCT and COUNTIF
- react-native - 通过屏幕堆栈传递道具
- ios - 有没有办法以编程方式更改滚动视图焦点?
- excel - 同时计算 4 个不同的字段:
- identityserver4 - .net core 3.1 Google SSO 回调网址未命中