如何在 Python 中跨多行和多列计算日期差异?

问题描述 投票:0回答:1

我正在尝试计算 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
之间的差异并按源和目的地分组来计算全时差。理想情况下,我想修改上面的相同代码块以适应这个。

谢谢!

python pyspark time group-by datediff
1个回答
1
投票

如果我理解正确以获得相同 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"')))
)
© www.soinside.com 2019 - 2024. All rights reserved.