У меня есть фрейм данных pyspark с четырьмя столбцами отметок времени (clock_in
, clock_out
, sign_in
и sign_out
).Мне нужен третий столбец (duration
), который представляет собой разницу между двумя столбцами, но для которых я использую разницу, зависит от значений самих столбцов в соответствии со следующими правилами:
- Если
clock_in > clock_out
, то duration = clock_in - clock_out
- Остальное, если
sign_in > clock_out
, то duration = sign_out - clock_out
- Остальное, если
clock_in > sign_in
, то duration = clock_in - clock_out
- В противном случае,
duration = 0
Я попытался определить UDF и применить его следующим образом:
from pyspark.sql import *
def calc_dur(clock_in, clock_out, sign_in, sign_out):
if clock_in > clock_out:
return clock_in - clock_out
elif sign_out > clock_out:
return sign_out - clock_out
elif sign_in < clock_in:
return clock_in - sign_in
else:
return 0
dur_udf = udf(calc_dur)
df2 = df.withColumn("duration", dur_udf(df.clock_in, df.clock_out, df.sign_in, df.sign_out))
Однако это заполняет мой столбец duration
Timedeltas (например,, Timedelta: 0 days, 1740 seconds, 0 microseconds (total: 1740 seconds)
), и когда я пытаюсь отфильтровать только строки с ненулевыми значениями в столбце duration
, он возвращает ноль строк.
Как правильно это сделать?