如何根据一组条件编写python函数



我有数百个项目条目,我正试图编写一个函数来计算仅在给定月份在项目阶段花费的时间。

每次项目阶段发生变化时,我都有一个项目条目。时钟在月初或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

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

最新更新