我有數百個專案條目,我正在嘗試撰寫一個函式來計算僅在給定月份期間在專案階段花費的時間。
每次專案階段發生變化時,我都有一個專案條目。時鐘在月初或 StageID 為 2 時開始。在月末或 StageID 為 3 時結束。
如何使用下面的資料框計算專案在指定的 start_date 和 end_date 之間在 StageID 2 中花費的時間?
start_date = pd.to_datetime('2021-07-01 00:00:00.000')
end_date = pd.to_datetime('2021-07-31 23:59:59.999')
df = pd.DataFrame({'ProjectID': [1,1,2,2],
'StageID' : [2,3,2,3,],
'Date' : ["2021-7-2", "2021-7-28", "2021-7-15", "2021-8-22"]})
我希望結果看起來像:
ProjectID DaysPassed
0 1 26
1 2 16
獎勵問題:
df = pd.DataFrame({'ProjectID': [1,1,1,1,2,2],
'StageID' : [2,3,2,3,2,3,],
'Date' : ["2021-7-5", "2021-7-10","2021-7-15","2021-7-20", "2021-7-15", "2021-8-22"]})
期望結果如下所示:
ProjectID DaysPassed
0 1 10
1 2 16
uj5u.com熱心網友回復:
IIUC,你想要:
output = df[df["StageID"].eq(2)].drop("StageID", axis=1).merge(df[df["StageID"].eq(3)].drop("StageID", axis=1), on="ProjectID")
output["DaysPassed"] = output["Date_y"].clip(upper=pd.Timestamp(2021,7,31)).sub(output["Date_x"])
output = output.drop(["Date_x", "Date_y"],axis=1)
>>> df
ProjectID DaysPassed
0 1 26 days
1 2 16 days
如果您的專案可以有多次迭代,您可以創建一個新列來唯一標識專案:
df = pd.DataFrame({'ProjectID': [1,1,1,1,2,2],
'StageID' : [2,3,2,3,2,3,],
'Date' : ["2021-7-5", "2021-7-10","2021-7-15","2021-7-20", "2021-7-15", "2021-8-22"]})
df["Date"] = pd.to_datetime(df["Date"])
df["Iteration"] = df.groupby(["ProjectID", "StageID"])["Date"].cumcount() 1
output = df[df["StageID"].eq(2)].drop("StageID", axis=1).merge(df[df["StageID"].eq(3)].drop("StageID", axis=1), on=["ProjectID", "Iteration"])
output["DaysPassed"] = output["Date_y"].clip(upper=pd.Timestamp(2021,7,31)).sub(output["Date_x"]).dt.output = output.drop(["Date_x", "Date_y"],axis=1)
>>> output
ProjectID Iteration DaysPassed
0 1 1 5
1 1 2 5
2 2 1 16
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/440328.html
上一篇:從資料中獲取R中函式的變數
