[英]Create 2 new time columns in a dataframe which are cumulative sum of min columns in pandas
我有一个数据框
df = pd.DataFrame([["X","0 min","30 mins"],["X","1 hour 1 min","20 mins"],["X","1 min","30 mins"],["X","41 mins","28 mins"],
["Y","0 min","30 mins"],["Y","35 mins","25 mins"],["Y","1 hour 21 mins","30 mins"]],columns=["id","travel_time","dur"])
id travel_time dur
X 0 min 30 mins
X 1 hour 1 min 20 mins
X 1 min 30 mins
X 41 mins 28 mins
Y 0 min 30 mins
Y 35 mins 25 mins
Y 1 hour 21 mins 30 mins
我想要另外 2 列start_time和end_time ,其中每个 id 从上午 9:00 开始,为 start_time 列添加 travel_time 并为 end_time 添加 dur。 对于下一行,为上一行添加 travel_time end_time 并重复相同的操作。
预期输出:
df_out = pd.DataFrame([["X","0 min","30 mins","9:00 AM","9:00 AM"],["X","1 hour 1 min","20 mins","10:01 AM","10:21 AM"],
["X","1 min","30 mins","10:22 AM","10:52 AM"],["X","41 mins","28 mins","11:33 AM","12:01 PM"],
["Y","0 min","30 mins","9:00 AM","9:00 AM"],["Y","35 mins","25 mins","9:35 AM","10:00 AM"],
["Y","1 hour 21 mins","30 mins","11:21 AM","11:51 AM"]],columns=["id","travel_time","dur","start_time","end_time"])
id travel_time dur start_time end_time
X 0 min 30 mins 9:00 AM 9:00 AM
X 1 hour 1 min 20 mins 10:01 AM 10:21 AM
X 1 min 30 mins 10:22 AM 10:52 AM
X 41 mins 28 mins 11:33 AM 12:01 PM
Y 0 min 30 mins 9:00 AM 9:00 AM
Y 35 mins 25 mins 9:35 AM 10:00 AM
Y 1 hour 21 mins 30 mins 11:21 AM 11:51 AM
如何在熊猫中做到这一点?
假设您忘记计算前 30 分钟的持续时间,您可以使用:
start = pd.Timestamp('2022-12-18 9:00')
# remove "s" in units and convert to timedelta
t = pd.to_timedelta(df['travel_time'].str.replace(r's\b', '', regex=True))
d = pd.to_timedelta(df['dur'].str.replace(r's\b', '', regex=True))
# compute start
df['start_time'] = (t
.groupby(df['id']).cumsum()
.add(d.groupby(df['id'])
.apply(lambda s: s.cumsum()
.shift(fill_value=pd.Timedelta('0'))
)
)
.add(start)
.dt.strftime('%I:%M %p')
)
# compute end
df['end_time'] = (t
.groupby(df['id']).cumsum()
.add(d.groupby(df['id']).cumsum())
.add(start)
.dt.strftime('%I:%M %p')
)
print(df)
输出:
id travel_time dur start_time end_time
0 X 0 min 30 mins 09:00 AM 09:30 AM
1 X 1 hour 1 min 20 mins 10:31 AM 10:51 AM
2 X 1 min 30 mins 10:52 AM 11:22 AM
3 X 41 mins 28 mins 12:03 PM 12:31 PM
4 Y 0 min 30 mins 09:00 AM 09:30 AM
5 Y 35 mins 25 mins 10:05 AM 10:30 AM
6 Y 1 hour 21 mins 30 mins 11:51 AM 12:21 PM
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.