我有一个pysparkDataframe,其中包含解析为\u date(dtype:date)和id(dtype:bigint)的列,如下所示:
+-------+-----------+
| id|parsed_date|
+-------+-----------+
|1471783| 2017-12-18|
|1471885| 2017-12-18|
|1472928| 2017-12-19|
|1476917| 2017-12-19|
|1477469| 2017-12-21|
|1478190| 2017-12-21|
|1478570| 2017-12-19|
|1481415| 2017-12-21|
|1472592| 2017-12-20|
|1474023| 2017-12-22|
|1474029| 2017-12-22|
|1474067| 2017-12-24|
+-------+-----------+
我有一个如下所示的函数。目的是传递日期(day)和t(天数)。在df1中,id在范围内计数(day-t,day),在df2中,id在范围内计数(day,day+t)。
def hypo_1(df, day, t):
df1 = (df.filter(f"parsed_date between '{day}' - interval {t} days and '{day}' - interval 1 day")
.withColumn('count_before', F.count('id').over(Window.partitionBy('parsed_date')))
.orderBy('parsed_date')
)
df2 = (df.filter(f"parsed_date between '{day}' + interval 1 day and '{day}' + interval {t} days")
.withColumn('count_after', F.count('id').over(Window.partitionBy('parsed_date')))
.orderBy('parsed_date')
)
return [df1, df2]
df1, df2 = hypo_1(df, '2017-12-20', 2)
df1.show()
+-------+-----------+------------+
| id|parsed_date|count_before|
+-------+-----------+------------+
|1471783| 2017-12-18| 2|
|1471885| 2017-12-18| 2|
|1472928| 2017-12-19| 3|
|1476917| 2017-12-19| 3|
|1478570| 2017-12-19| 3|
+-------+-----------+------------+
df2.show()
+-------+-----------+-----------+
| id|parsed_date|count_after|
+-------+-----------+-----------+
|1481415| 2017-12-21| 3|
|1478190| 2017-12-21| 3|
|1477469| 2017-12-21| 3|
|1474023| 2017-12-22| 2|
|1474029| 2017-12-22| 2|
+-------+-----------+-----------+
我想知道如果在这个范围内缺少一个日期,如何修复这个代码?假设没有关于 2017-12-22
? 有可能有记录在案的即时天数吗?我是说如果 2017-12-22
是不是还有之后的下一个日期 2017-12-21
是 2017-12-24
那么,有没有可能采取某种方式呢?
感谢mck帮助创建函数 hypo_1(df, day, t)
.
1条答案
按热度按时间lkaoscv71#
我移除了
2017-12-22
要说明的行。我的想法是得到一个dense_rank
按日期排序(降序表示之前,升序表示之后),并过滤秩<=2的行,即最近的两个日期。