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
我有以下包含许多日期的数据框。我想:
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