我有数以百计的项目条目,我试图编写一个函数来计算一个项目阶段在给定的一个月内花费的时间。
我有一个项目的条目,每次有一个项目阶段的变化。时钟从月初或StageID为2开始,到月底或StageID为3时结束。
如何使用下面的数据计算项目在StageID 2中在指定的start_date和end_date之间的花费时间?
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发布于 2022-03-08 20:08:11
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 16https://stackoverflow.com/questions/71400672
复制相似问题