TypeError:无法推断类型的架构:<class'datetime.timedelta'>

2024-05-16 20:51:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下的数据帧

+----------+-----------+
|START_DATE|FINISH_DATE|
+----------+-----------+
|2017-01-02| 2022-09-18|
|2022-09-19| 2025-03-04|
|2025-03-05| 2027-09-14|
|2027-09-15| 2028-12-06|
|2028-12-07| 2031-08-28|
+----------+-----------+

要求比较连续行的开始日期和结束日期。下一行的开始日期应仅比上一行的结束日期多1。对于dataframe中的所有行,如果下一行的开始日期仅比上一行的结束日期多1,则应返回True。(此函数应在数据帧级别而不是行级别返回true)

我使用了滞后窗口分析函数

dfu = df.withColumn('user', lit('user'))  //df is the above dataframe
windowPartition = Window.partitionBy("user").orderBy("START_DATE")

df_lag =dfu.withColumn('prev_row_startdate',F.lag(dfu['START_DATE'],-1).over(windowPartition))
df_lag_drp=df_lag.na.drop()

下面是本报告的输出

+----------+-----------+----+------------------+
|START_DATE|FINISH_DATE|user|prev_row_startdate|
+----------+-----------+----+------------------+
|2017-01-02| 2022-09-18|user|        2022-09-19|
|2022-09-19| 2025-03-04|user|        2025-03-05|
|2025-03-05| 2027-09-14|user|        2027-09-15|
|2027-09-15| 2028-12-06|user|        2028-12-07|
+----------+-----------+----+------------------+

我已经写了一个lambda函数来计算差异,但是得到了下面的错误

TypeError:无法推断类型的架构:<;类“datetime.timedelta”>

df_dif=df_lag_drp.rdd.map(lambda x: (x["prev_row_startdate"]-x["FINISH_DATE"]))

我知道我需要一个lambda函数,它可以迭代“df_lag_drp”数据帧的每一行,并且应该能够找到“prev_row_startdate”和“start_date”之间的差异,如果每一行的差异仅为1,那么它应该返回true,否则返回false,但我确实被困在这个问题上。 请告诉我是否有其他有效的方法来实现这一点。我正在使用Python3.9和spark3.x


Tags: 数据lambda函数dfdate差异startlag