pandas 列中的所有组合日期差异

All combination date differences in pandas column

我有以下包含许多日期的数据框。我想:

sales_agents["hire_date"]


  0    2017-04-01 00:00:00

  1    2017-05-03 00:00:00

  2    2017-10-17 00:00:00

  Name: hire_date, dtype: object

我想获得从第 0 行到第 n 行的天数差异:

output = [(2017-04-01 - 2017-05-03), (2017-04-01 - 2017-10-17), (2017-05-03 - 2017-10-17)]

结果应该在 DAYS 内,我想得到除它本身之外的所有可能组合的差异。

你能帮忙吗?

一个选择是进行 'cross' 合并并使用索引过滤到基本上上三角,这样您就不会重复计算 AB 和 BA 合并(第 1 行与第 2 行和第 2 行与第 1 行),并排除 AA 合并(第 1 行与自身合并)。

然后结果会显示差异(以天为单位)以及用于形成该差异的两个日期。如果您想记录这些日期的来源,您可以删除代码的 .drop(columns=['index_x', 'index_y']) 部分。

示例数据

import pandas as pd
df = pd.DataFrame({'date': ['2017-04-01 00:00:00', '2017-05-03 00:00:00', 
                            '2017-10-17 00:00:00']})
df['date'] = pd.to_datetime(df.date)

代码

res = (pd.merge(df[['date']].reset_index(), df[['date']].reset_index(), how='cross')
         .query('index_x > index_y')
         .drop(columns=['index_x', 'index_y']))

res['diff'] = (res['date_y'] - res['date_x']).dt.days

print(res)
#      date_x     date_y  diff
#3 2017-05-03 2017-04-01   -32
#6 2017-10-17 2017-04-01  -199
#7 2017-10-17 2017-05-03  -167

或者,您可以使用外减法在 numpy 中执行此操作,然后提取值的下三角(不包括对角线 k=1)。由于这些是以纳秒为单位计算的,因此我们需要通过 10**9*60*60*24

的系数转换为天
import numpy as np

arr = df['date'].to_numpy()[:, None] - df['date'].to_numpy()[None, :]
days = arr[np.triu_indices(arr.shape[0], k=1)]/(10**9*60*60*24)

days
#array([ -32, -199, -167], dtype='timedelta64[ns]')

可以使用交叉合并和 numpy 外减来做一个邻接矩阵。下面的代码

g, h = df.merge(df, how='cross').to_numpy().T
g=np.unique(g)
h=np.unique(h)

pd.DataFrame(np.subtract.outer(g, g), h, h) 

    

             2017-04-01 2017-05-03 2017-10-17
2017-04-01     0 days   -32 days  -199 days
2017-05-03    32 days     0 days  -167 days
2017-10-17   199 days   167 days     0 days