Table: Employees
+-------------+------+
| Column Name | Type |
+-------------+------+
| emp_id | int |
| event_day | date |
| in_time | int |
| out_time | int |
+-------------+------+
(emp_id, event_day, in_time)은 이 테이블의 기본 키(고유 값이 있는 열들의 조합)입니다.
이 테이블은 직원들의 사무실 출입 기록을 보여줍니다.
event_day는 이 이벤트가 발생한 날짜를 나타내며, in_time은 직원이 사무실에 입장한 분을 나타내고, out_time은 직원이 사무실을 떠난 시간을 나타냅니다.
in_time과 out_time은 1과 1440 사이의 값입니다.
같은 날짜에 두 이벤트가 시간상 겹치지 않으며, in_time은 out_time보다 항상 작다는 것이 보장됩니다.
문제
각 직원이 하루 동안 사무실에서 보낸 총 시간을 계산하는 솔루션을 작성하세요. 하나의 날짜에 직원이 여러 번 입장하고 퇴장할 수 있다는 점에 유의하세요. 하나의 입장에 대해 사무실에서 보낸 시간은 out_time - in_time입니다.
결과 테이블은 아무 순서로 반환할 수 있습니다.
결과 형식은 아래 예시와 같습니다.
Example 1:
Input:
Employees table:
+--------+------------+---------+----------+
| emp_id | event_day | in_time | out_time |
+--------+------------+---------+----------+
| 1 | 2020-11-28 | 4 | 32 |
| 1 | 2020-11-28 | 55 | 200 |
| 1 | 2020-12-03 | 1 | 42 |
| 2 | 2020-11-28 | 3 | 33 |
| 2 | 2020-12-09 | 47 | 74 |
+--------+------------+---------+----------+
Output:
+------------+--------+------------+
| day | emp_id | total_time |
+------------+--------+------------+
| 2020-11-28 | 1 | 173 |
| 2020-11-28 | 2 | 30 |
| 2020-12-03 | 1 | 41 |
| 2020-12-09 | 2 | 27 |
+------------+--------+------------+
설명 :
직원 1은 세 개의 이벤트가 있습니다: 2020-11-28에 두 개의 이벤트가 있으며, 총 시간은 (32 - 4) + (200 - 55) = 173이고, 2020-12-03에 한 개의 이벤트가 있으며, 총 시간은 (42 - 1) = 41입니다.
직원 2는 두 개의 이벤트가 있습니다: 2020-11-28에 한 개의 이벤트가 있으며, 총 시간은 (33 - 3) = 30이고, 2020-12-09에 한 개의 이벤트가 있으며, 총 시간은 (74 - 47) = 27입니다.
✏️ 풀이
import pandas as pd
def total_time(employees: pd.DataFrame) -> pd.DataFrame:
employees['in_out_time'] = employees['out_time'] - employees['in_time']
result = employees.groupby(['emp_id', 'event_day'])['in_out_time'].sum().reset_index(name='total_time')
return result[['event_day', 'emp_id', 'total_time']].rename(columns={'event_day': 'day'})