我正在尝试计算 ID 中第一个
Sent
日期/时间与 ID 中最后一个 Received
日期/时间之间的差异,并按来源和目的地对它们进行分组。示例(名为test_subset
)看起来像这样(但它是'000行):
| ID | From | To | leg_sent | leg_received | Source | Destination |
|:-----|:-----|:-----|:---------|:-------------|:-------|:------------|
| 1btr | ABC | XYZ | 08:22:23 | 08:22:41 | GB | FR |
| 1btr | XYZ | DEF | 08:22:49 | 08:23:05 | GB | FR |
| 2vyu | LMN | JFK | 14:35:11 | 14:35:23 | US | DE |
| 2vyu | JFK | HIJ | 14:35:35 | 14:35:48 | US | DE |
| 2vyu | HIJ | TPQ | 14:35:51 | 14:36:25 | US | DE |
在数据中,
ID
是一个传输 ID,From
和 To
行是传输的每条腿。在某些情况下,它们可能只有 2 条腿,而在其他情况下可能有多达 10 条;必须计算的是第一次发送和最后一次接收之间的差异,它们不会在同一行。 Source
和 Destination
将在与相同 ID 相关的所有行中保持相同。
我目前有一段代码(如下)可用于计算同一行上
leg_sent
和 leg_received
之间的差异,并按 From 和 To 代码对其进行分组:
pairs = (
test_subset
.withColumn('"leg_time"', F.datediff('seconds', F.col('"leg_sent"'), F.col('"leg_received"')))
.groupBy(['"From"', '"To"'])
.agg(
F.count('*').alias('"num_paths"'),
F.avg('"leg_time"').alias('"average_leg_time"'),
F.min('"leg_time"').alias('"min_leg_time"'),
F.max('"leg_time"').alias('"max_leg_time"')
)
.withColumn('"leg_range"', F.col('"max_leg_time"') - F.col('"min_leg_time"'))
)
我需要通过计算相同 ID 的第一个
leg_sent
和最后一个 leg_received
之间的差异并按源和目的地分组来计算全时差。理想情况下,我想修改上面的相同代码块以适应这个。
谢谢!
如果我理解正确以获得相同 ID、来源和目的地的完整时间,我认为您可以按
ID
、Source
和 Destination
分组并获得 MIN(leg_sent)
和 MAX(leg_received)
然后计算区别
pairs = (
test_subset
.groupBy(['"ID"', '"Source"', '"Destination"'])
.agg(
F.min('"leg_sent"').alias('"min_leg_sent"'),
F.max('"leg_received"').alias('"max_leg_received"')
)
.withColumn('"leg_full_time"', F.datediff('seconds', F.col('"min_leg_sent"'), F.col('"max_leg_received"')))
)