본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[데이터 전처리- 날짜함수 예제] 날짜 함수를 사용한 기준월 사이의 기간(Gap) 계산 - 75

by 기서무나구물 2021. 8. 31.

포스팅 목차

     

    75. Display your age in months.

     

    * 나이를 월단위로 계산하라.


    • [날짜 함수]날짜 함수를 사용한 기준월 사이의 기간(Gap) 계산
    • Oracle : floor() 함수
    • 파이썬 Pandas : datetime.today(), time.time(), strftime() 날짜 포맷, def 사용자 정의 함수, relativedelta()
    • R 프로그래밍 : year(), month(), Sys.Date(), lubridate::interval 함수, seq(), Length()
    • R Dplyr Package :
    • R sqldf Package : round() 함수, julianday()
    • Python pandasql Package : round() 함수, julianday()
    • R data.table Package :
    • SAS Proc SQL : intck(), Input(), DATDIF()
    • SAS Data Step : intck(), DATDIF(), Round()
    • Python Dfply Package : datetime(), today(), def 사용자 정의 함수
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    months_between 함수를 사용하여서 2개 날짜 사이의 개월 수 차이를 계산한다.

    Oracle Programming
    select floor(months_between(sysdate,'15-aug-1947')) "age_in_months" 
    from   dual

     


    2. Python Pandas(파이썬)

    • 참고 : 오늘 날짜 출력
    Python Programming
    from datetime import datetime
    today = datetime.today().strftime('%Y-%m-%d')
    print(today)
    
    import time
    t = time.time()
    
    # 지역표준시
    today = time.strftime("%Y-%m-%d", time.localtime(t))
    print( today )
    
    # UTC(그리니치 표준시) 기준
    today = time.strftime("%Y-%m-%d", time.gmtime(t))
    print( today )

     

    Results
    2021-03-12
    2021-03-12
    2021-03-11

     


    2개 날짜 사이의 월 단위 차이를 계산하는 diff_month 함수를 생성하여서 2개 날짜 사이의 개월 수 차이를 계산한다.

    Python Programming
    from datetime import datetime
    
    def diff_month(d1, d2):
        return (d1.year - d2.year) * 12 + d1.month - d2.month
    
    diff_month(datetime.today(), datetime(2020, 1, 20))

     

    Results
    14

     


    relativedelta 함수를 사용하여서 날짜 사이의 차이를 계산한다. 반환된 개체에서 년도와 월에 해당하는 개체를 추출하여 월 단위로 환산한다.

    Python Programming
    from dateutil.relativedelta import relativedelta
    
    r = relativedelta(datetime.today(), datetime(2020, 1, 20))
    print(r)
    r.months + (12*r.years) +1

     

    Results
    relativedelta(years=+1, months=+1, days=+20, hours=+8, minutes=+30, seconds=+27, microseconds=+756891)
    
    
    
    14

     


    3. R Programming (R Package)

    날짜에서 년도와 월을 추출하여서 2개 날짜 사이의 개월 수 차이를 계산한다.

    R Programming
    %%R
    
    number_of_months = (year(Sys.Date()) - year(as.Date('2020-01-20'))) * 12 + month(Sys.Date()) - month(as.Date('2020-01-20'))
    number_of_months

     

    Results
    [1] 14

     


    lubridate::interval 함수를 사용하여서 2개 날짜 사이의 개월 수 차이를 계산한다. 반환된 시간 간격(time interval) 개체에서 날짜 사이의 차이를 월단위로 계산한다.

    R Programming
    %%R
    
    print(interval(mdy(01202020), today()) %/% months(1))
    
    lubridate::interval(as.Date('2020-01-20'), today()) %/% months(1)

     

    Results
    [1] 13
    [1] 1

     


    seq 함수를 사용하여서 2개 날짜 사이를 월 단위의 시계열 객체를 생성 후 객체 길이를 계산한다.

    R Programming
    %%R
    
    length(seq(from=as.Date('2020-01-20'), to=today(), by='month'))

     

    Results
    [1] 14

     


    4. R Dplyr Package

     


    5. R sqldf Package

    2개 날짜 사이의 날짜 차이를 계산 후 월단위로 환산한다.

    R Programming
    %%R
    
    sqldf("select round( (julianday('now')-julianday('2020-01-20')) /30) months_gap ")

     

    Results
      months_gap
    1         14

     


    6. Python pandasql Package

     

    Python Programming
    ps.sqldf("select round( (julianday('now')-julianday('2020-01-20')) /30) months_gap")

     

    Results
      months_gap
    0 14.0

     


    7. R data.table Package

     


    8. SAS Proc SQL

    • Intck 함수, Datdif 함수를 사용하여서 2개 날짜 사이의 개월 수 차이를 계산한다.
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select intck('month', input('20200120',yymmdd8.), TODAY())                 AS month_gap_1,
               ROUND(DATDIF(input('20200120',yymmdd8.), TODAY(), 'ACT/ACT') / 30 ) AS month_gap_2
        FROM   EMP(OBS=1);
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS month_gap_1 month_gap_2
    1 15 15

     


    9. SAS Data Step

    • Intck 함수를 사용하여서 2개 날짜 사이의 개월 수 차이를 계산한다.
    SAS Programming
    %%SAS sas
    
    DATA STATSAS_2;
         * 오늘 날짜와 YEAR 함수;
         THIS_YEAR_1 = YEAR(TODAY());
         THIS_YEAR_2 = YEAR(DATE());
    
         format base_date base_date_1 yymmddn8.;
         base_date   = input('20200120',yymmdd8.);
         base_date_1 = mdy(1,20,2020);
    
         month_gap_1 = intck('month', input('20200120',yymmdd8.), TODAY());
    
         /* 참고 */
         month_gap_2 = ROUND(DATDIF(input('20200120',yymmdd8.), TODAY(), 'ACT/ACT') / 30 ); * 날짜GAP 환산;
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS THIS_YEAR_1 THIS_YEAR_2 base_date base_date_1 month_gap_1 month_gap_2
    1 2021 2021 20200120 20200120 15 15

     


    10. Python Dfply Package

     

    Python Programming
    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    def diff_month(d1, d2):
        return (d1.year - d2.year) * 12 + d1.month - d2.month
    
    diff_month(datetime.today(), datetime(2020, 1, 20))
    
    emp >> mutate(number_of_months = diff_month(datetime.today(), datetime(2020, 1, 20)) ) >> \
      select(~X.job,~X.mgr,~X.sal,~X.comm) >> head()

     

    Results
      empno ename hiredate deptno number_of_months
    0 7369 SMITH 1980/12/17 20 16
    1 7499 ALLEN 1981/02/20 30 16
    2 7521 WARD 1981/02/22 30 16
    3 7566 JONES 1981/04/02 20 16
    4 7654 MARTIN 1981/09/28 30 16

     


    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]   SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트

    반응형

    댓글