포스팅 목차
146. Write query to calculate the length of employee has been with the company?
* 현재 일자를 기준으로 사원별 회사 입사 후 근속 년수를 계산하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 유사문제 : 12/135
- [날짜 데이터] 날짜 기간 차이 계산 - 현재 날짜
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산한다.
Oracle Programming |
Select empno,ename,hiredate,
round( (sysdate-hiredate)/365) hire_gap
from emp;
2. Python Pandas(파이썬)
현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 assign() 함수를 사용하여 신규 변수 ‘hire_gap’를 생성한다.
Python Programming |
emp.assign(hire_gap = (pd.Timestamp.now() - pd.to_datetime(emp['hiredate'])).dt.days /365 ).head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | hire_gap | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 | 40.312329 |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 | 40.134247 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 | 40.128767 |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 | 40.021918 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 | 39.531507 |
3. R Programming (R Package)
현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 transform() 함수를 사용하여 신규 변수 ‘hire_gap’를 생성한다.
R Programming |
%%R
withmooc <- transform(emp, hire_gap = (Sys.Date() - hiredate) / 365)
withmooc[1:7, ]
Results |
empno ename job mgr hiredate sal comm deptno hire_gap
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 40.31233 days
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 40.13425 days
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 40.12877 days
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 40.02192 days
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 39.53151 days
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 40.10959 days
7 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10 40.24932 days
4. R Dplyr Package
현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 dplyr::mutate() 함수를 사용하여 신규 변수 ‘hire_gap’를 생성한다.
R Programming |
%%R
emp %>%
dplyr::mutate( hire_gap = (Sys.Date() - hiredate) / 365 ) %>%
head(7)
Results |
# A tibble: 7 x 9
empno ename job mgr hiredate sal comm deptno hire_gap
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl> <drtn>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 40.34521 days
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 40.16712 days
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 40.16164 days
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 40.05479 days
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 39.56438 days
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 40.14247 days
7 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10 40.28219 days
5. R sqldf Package
현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산한다. 경과일자를 계산하기 위하여 julianday 함수로 경과일자를 계산 후 근속년수로 환산한다.
- 날짜 관련 문제 : 74 / 135 / 146번
- julianday : 74번(http://statwith.com/emp-example-sql-r-python-74/)
- 정확한 날짜 계산을 위하여 julianday 함수를 사용하여 일자 사이의 차이를 계산하여 근속년수를 환산한다.
- hire_gap2 변수는년도를 기준으로 근속년수를 산정하여서 일부 직원의 근속년수는 차이가 발생한다.
R Programming |
%%R
sqldf("select empno,ename,hiredate,
datetime('now','localtime') now_date,
strftime('%d-%m-%Y', 'now') now_char,
(julianday('now','localtime') - julianday(datetime(hiredate * 3600 * 24,'unixepoch'))) / 365 hire_gap,
(date('now','localtime') - datetime(hiredate * 3600 * 24,'unixepoch')) hire_gap2
from emp") %>% head(7)
Results |
empno ename hiredate now_date now_char hire_gap hire_gap2
1 7369 SMITH 1980-12-17 2021-04-12 00:13:43 11-04-2021 40.34523 41
2 7499 ALLEN 1981-02-20 2021-04-12 00:13:43 11-04-2021 40.16715 40
3 7521 WARD 1981-02-22 2021-04-12 00:13:43 11-04-2021 40.16167 40
4 7566 JONES 1981-04-02 2021-04-12 00:13:43 11-04-2021 40.05482 40
5 7654 MARTIN 1981-09-28 2021-04-12 00:13:43 11-04-2021 39.56441 40
6 7698 BLAKE 1981-03-01 2021-04-12 00:13:43 11-04-2021 40.14249 40
7 7782 CLARK 1981-01-09 2021-04-12 00:13:43 11-04-2021 40.28222 40
8 7788 SCOTT 1982-12-09 2021-04-12 00:13:43 11-04-2021 38.36715 39
9 7839 KING 1981-11-17 2021-04-12 00:13:43 11-04-2021 39.42742 40
10 7844 TURNER 1981-09-08 2021-04-12 00:13:43 11-04-2021 39.61920 40
11 7876 ADAMS 1983-01-12 2021-04-12 00:13:43 11-04-2021 38.27400 38
12 7900 JAMES 1981-12-03 2021-04-12 00:13:43 11-04-2021 39.38359 40
13 7902 FORD 1981-12-03 2021-04-12 00:13:43 11-04-2021 39.38359 40
14 7934 MILLER 1982-01-23 2021-04-12 00:13:43 11-04-2021 39.24386 39
6. Python pandasql Package
현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산한다.
Python Programming |
ps.sqldf(" select ( julianday(date('now')) - \
julianday(substr(hiredate,1,4)||'-'||substr(hiredate,6,2)||'-'||substr(hiredate,9,2) ) )/365 gap_float, \
(strftime('%s','now') - strftime('%s',(substr(hiredate,1,4)||'-'||substr(hiredate,6,2)||'-'||substr(hiredate,9,2))))/60/60/24 /365 second_int \
from emp ").head(7)
Results |
gap_float | second_int | |
0 | 40.342466 | 40 |
1 | 40.164384 | 40 |
2 | 40.158904 | 40 |
3 | 40.052055 | 40 |
4 | 39.561644 | 39 |
5 | 40.139726 | 40 |
6 | 40.279452 | 40 |
7. R data.table Package
현재 일자를 기준으로 회사 입사일 이후 경과된 근무일자를 계산 후 근속 년수로 환산하여 계산 후 신규 변수 ‘hire_gap’으로 생성한다.
R Programming |
%%R
DT <- data.table(emp)
DT[, hire_gap := (Sys.Date() - hiredate) / 365,][1:7, ]
Results |
empno ename job mgr hiredate sal comm deptno hire_gap
1: 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 40.36164 days
2: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 40.18356 days
3: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 40.17808 days
4: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 40.07123 days
5: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 39.58082 days
6: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 40.15890 days
7: 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10 40.29863 days
8. SAS Proc SQL
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
Select empno,hiredate,
DATDIF(hiredate, TODAY(), 'ACT/ACT') / 365 as hire_gap,
YRDIF(hiredate, TODAY(), 'ACT/ACT') as hire_gap2
from emp;
QUIT;
PROC PRINT data=STATSAS_1(obs=5);RUN;
Results |
OBS | empno | hiredate | hire_gap | hire_gap2 |
1 | 7369 | 1980-12-17 | 40.3616 | 40.3341 |
2 | 7499 | 1981-02-20 | 40.1836 | 40.1562 |
3 | 7521 | 1981-02-22 | 40.1781 | 40.1507 |
4 | 7566 | 1981-04-02 | 40.0712 | 40.0438 |
5 | 7654 | 1981-09-28 | 39.5808 | 39.5534 |
9. SAS Data Step
SAS Programming |
%%SAS sas
DATA STATSAS_2;
set emp;
hire_gap = DATDIF(hiredate, TODAY(), 'ACT/ACT') / 365;
hire_gap2 = YRDIF(hiredate, TODAY(), 'ACT/ACT');
KEEP EMPNO hiredate HIRE_: ;
RUN;
PROC PRINT data=STATSAS_2(obs=5);RUN;
Results |
OBS | empno | hiredate | hire_gap | hire_gap2 |
1 | 7369 | 1980-12-17 | 40.3616 | 40.3341 |
2 | 7499 | 1981-02-20 | 40.1836 | 40.1562 |
3 | 7521 | 1981-02-22 | 40.1781 | 40.1507 |
4 | 7566 | 1981-04-02 | 40.0712 | 40.0438 |
5 | 7654 | 1981-09-28 | 39.5808 | 39.5534 |
10. Python Dfply Package
Python Programming |
emp >> \
mutate( hire_gap = (pd.Timestamp.now() - make_symbolic(pd.to_datetime)(X.hiredate)).dt.days /365 ) >> \
head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | hire_gap | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 | 40.380822 |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 | 40.202740 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 | 40.197260 |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 | 40.090411 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 | 39.600000 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
반응형
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[날짜 함수] 특정 조건에 따라 해당 날짜 반환 - 148 (오라클 SQL, R, Python, SAS) (1) | 2023.01.03 |
---|---|
[문자함수와 조건문] 조건에 따라 값을 변경 - 147 (오라클 SQL, R, Python, SAS) (0) | 2023.01.02 |
[Case When 조건문] 조건에 따라 값을 변경 - 145 (오라클 SQL, R, Python, SAS) (0) | 2023.01.02 |
[날짜 포맷] 날짜 출력 포맷 지정 - 144 (오라클 SQL, R, Python, SAS) (1) | 2023.01.01 |
[문자 함수] 문자열 결합 함수 - 143 (오라클 SQL, R, Python, SAS) (0) | 2022.12.31 |
댓글