Как извлечь первую и последнюю запись, сделанную сотрудником за смену pandas - PullRequest
0 голосов
/ 09 мая 2020

Edit: Я очень сожалею о путанице, ясно, что я не объяснил это хорошо, мне нужно сохранять первую и последнюю запись для каждого человека на каждый день в моем CSV.

Basically what I have is:     


    3/4/2020 8:29   Ali             
    3/4/2020 8:35   Vlad
    3/4/2020 11:47  Vlad
    3/4/2020 11:47  Vlad
    3/4/2020 11:49  Ali
    3/4/2020 13:44  Vlad
    3/4/2020 11:49  Ali
    3/4/2020 14:15  Vlad
    3/4/2020 17:20  Ali
    3/4/2020 17:54  Vlad
    3/5/2020 07:20  Ali




And what I need is:



    3/4/2020 8:29   Ali     
    3/4/2020 17:20  Ali
    3/4/2020 8:35   Vlad
    3/4/2020 17:54  Vlad

Ответы [ 3 ]

2 голосов
/ 09 мая 2020
df.Date=pd.to_datetime(df.Date)#Coaerce Date to Datetime
df.set_index(df.Date, inplace=True)#Set Date as index
df2=df.groupby(df.Name).Date.agg(['first', 'last']).stack().reset_index()#Groupby and extract names and dates
df2.columns=['Name', 'ShiftSignIn', 'Date']

enter image description here

0 голосов
/ 09 мая 2020

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
0 голосов
/ 09 мая 2020
df_bydate = df.sort_values(by='DateTime',ascending=True)

df_grouped = df_bydate.groupby('DateTime')['Employee'].apply(list)

Ali_first = df_grouped["Ali"].values[0]
Ali_last = df_grouped["Ali"].values[-1] 

У меня не было возможности попробовать, но, возможно, это решит вашу проблему. Здесь мы сначала сортируем таблицу по датам, а затем используем метод groupby для получения дат, связанных с сгруппированными сотрудниками, так что теперь каждый столбец является сотрудником, а каждая строка - датой. И поскольку даты сортируются, если вы получаете первый элемент столбца, вы получите доступ к первой дате, опубликованной этим сотрудником. Не беспокойтесь о ночных сменах, так как сортировка по дате и времени должна отсортировать их в хронологическом порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...