繁体   English   中英

在数据框中创建 2 个新时间列,它们是熊猫中最小列的累积和

[英]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_timeend_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM