检查不同数据行之间的时间(时间)以及员工的日期和姓名

时间:2019-10-02 16:34:33

标签: python-3.x pandas

我有一个带有此信息的df ['名称','部门','日期','时间','活动'], 所以例如看起来像这样:

raw data

Hirto的Acosta,西28街225号9/18/2019 07:25:00 Punch In
赫托(Hirto)阿科斯塔(Acosta),西28街225号9/18/2019 11:57:00打孔
赫托Acosta,西28街225号9/18/2019 12:28:00打孔

亚当斯,胡安225西28街9/16/2019 06:57:00打孔
亚当斯,胡安225西28街9/16/2019 12:00:00打孔
亚当斯,胡安225 West 28th Street 9/16/2019 12:28:00 Punch In
亚当斯,胡安225西28街9/16/2019 15:30:00打孔
亚当斯,胡安225 West 28th Street 9/18/2019 07:04:00 Punch In
亚当斯,胡安225西28街9/18/2019 11:57:00打孔

我需要计算同一位员工在同一天从打卡到打卡的时间。 我设法清理数据 喜欢:

    self.raw_data['Time'] = pd.to_datetime(self.raw_data['Time'], format='%H:%M').dt.time
    sorted_db = self.raw_data.sort_values(['Name', 'Date'])
    sorted_db = sorted_db[['Name', 'Department', 'Date', 'Time', 'Activity']]

任何建议将不胜感激

1 个答案:

答案 0 :(得分:0)

所以我找到了问题的答案,我想分享它。

如果有两列,则首先将“ Punch in”和“ Punch Out”分开

    def process_info(self):

    # filter data and organized --------------------------------------------------------------
    self.raw_data['in'] = self.raw_data[self.raw_data['Activity'].str.contains('In')]['Time']
    self.raw_data['pre_out'] = self.raw_data[self.raw_data['Activity'].str.contains('Out')]['Time']

我按日期和时间对信息库进行排序

        sorted_data = self.raw_data.sort_values(['Date', 'Name'])

此后,我使用shift函数将“ out”列向上移动,使其与in平行。

        sorted_data['out'] = sorted_data.shift(-1)['Time']

最后,我取出第一步中创建的多余列。但要检查它本身。

        filtered_data = sorted_data[sorted_data['pre_out'].isnull()]