IIU C, groupby
agg
, с stack
мы будем использовать drop_duplicates
для обработки записей только с одной записью в день.
#create helper column.
df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'],format='%m/%d/%Y %H:%M')
df2 = df.groupby(['name',df['datetime'].dt.day])\
.agg(first=('datetime','min'),
last=('datetime','max')).stack().reset_index()\
.rename(columns={'level_2' : 'status','datetime' : 'day', 0 : 'datetime'})\
.drop_duplicates(subset=['name','datetime'],keep='first')
print(df2)
name day status datetime
0 Ali 4 first 2020-03-04 08:29:00
1 Ali 4 last 2020-03-04 17:20:00
2 Ali 5 first 2020-03-05 07:20:00
4 Dan 4 first 2020-03-04 23:01:00
6 Dan 5 first 2020-03-05 02:01:00
7 Dan 5 last 2020-03-05 07:41:00
8 Vlad 4 first 2020-03-04 08:35:00
9 Vlad 4 last 2020-03-04 17:54:00
если вам нужны только записи с началом и концом sh изменить keep=False
name day status datetime
0 Ali 4 first 2020-03-04 08:29:00
1 Ali 4 last 2020-03-04 17:20:00
6 Dan 5 first 2020-03-05 02:01:00
7 Dan 5 last 2020-03-05 07:41:00
8 Vlad 4 first 2020-03-04 08:35:00
9 Vlad 4 last 2020-03-04 17:54:00