我有以下包含許多日期的資料框。我想要:
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 行的 DAYS 差異:
output = [(2017-04-01 - 2017-05-03), (2017-04-01 - 2017-10-17), (2017-05-03 - 2017-10-17)]
結果應該在 DAYS 內,我想獲得除自身之外的所有可能組合的差異。
你能幫我嗎?
uj5u.com熱心網友回復:
可以使用交叉合并和 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
uj5u.com熱心網友回復:
一種選擇是進行'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]')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/407493.html
標籤:
