如何按条件计算以毫秒为单位的总差异?

How to calculate total difference in milliseconds by condition?

我有以下 pandas 数据框 df:

timestamp version actual pred
2022-01-19 11:00:00.600 1 0 0
2022-01-19 11:00:00.800 1 0 1
2022-01-19 11:00:01.200 1 1 0
2022-01-19 11:00:01.800 1 0 0
2022-01-19 11:00:02.200 2 1 1
2022-01-19 11:00:02.600 2 0 0
2022-01-19 11:00:03.200 3 0 1
2022-01-19 11:00:03.600 3 0 0
2022-01-19 11:00:03.800 3 1 0
2022-01-19 11:00:03.600 4 0 0
2022-01-19 11:00:03.800 4 0 1

我需要计算 actualpred1 的值之间的总距离(以毫秒为单位),按 version.

分组

预期答案是:1000 毫秒

假设每个“版本”都存在一个“实际”值和一个“预测”值,我们可以简单地减去值。换句话说,如果每个“版本”恰好有 1 个“实际”值和恰好 1 个“预测”值,那么 df['actual'].eq(1) 对于每个“版本”只有一个值将为真; df['pred'].eq(1) 也一样。由于数据按“版本”排序,因此版本匹配。

df['timestamp'] = pd.to_datetime(df['timestamp'])
out = ((df.loc[df['actual'].eq(1), 'timestamp'].to_numpy() - 
        df.loc[df['pred'].eq(1), 'timestamp'].to_numpy())
       .astype('timedelta64[ms]').sum())

如果不是所有版本的“actual”或“pred”都为1,我们仍然可以过滤“actual”和“pred”值;然后合并“version”(这样每个“version”都会有一个“actual”和一个“pred”值);然后找出差异 sum:

df['timestamp'] = pd.to_datetime(df['timestamp'])
merged = (df.loc[df['actual'].eq(1), ['version', 'timestamp']]
          .merge(df.loc[df['pred'].eq(1), ['version', 'timestamp']], 
                 on='version', suffixes=('_actual', '_pred')))

out = (merged['timestamp_actual'] - merged['timestamp_pred']).astype('timedelta64[ms]').sum()

输出:

1000