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

[데이터 전처리- 날짜함수] 가장 빠른 요일에 해당하는 날짜 반환 - 78

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

포스팅 목차

    78. Find the date of nearest Saturday after current day.

     

    * 현재 날짜 이후 가장 빠른 토요일 날짜를 출력하시오.


    • [날짜 함수] 현재 일자를 기준으로 가장 빠른 요일에 해당하는 날짜를 반환
    • Oracle : next_day() 함수
    • 파이썬 Pandas :
    • R 프로그래밍 :
    • R Dplyr Package :
    • R sqldf Package :
    • Python pandasql Package :
    • R data.table Package :
    • SAS Proc SQL :
    • SAS Data Step :
    • Python Dfply Package :
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    오늘 날짜 이후 가장 빠른 토요일 날짜를 출력한다.

    Oracle Programming
    select next_day(sysdate, 'SATURDAY') next_Sat
    from   dual

     


    2. Python Pandas(파이썬)

    특정 일자를 기준으로 1주일 경과된 날짜를 반환한다.

    Python Programming
    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    # 오늘 날짜를 기준으로 1주일 경과된 날짜를 반환한다.
    datetime.now().date() + relativedelta(weeks=+1)
    
    # 2021년 3월 12일 기준으로 1주일 경과된 날짜를 반환한다.
    datetime.strptime('2021-03-12', '%Y-%m-%d') + relativedelta(weeks=+1)

     

    Results
    datetime.datetime(2021, 3, 19, 0, 0)

     


    오늘 날짜를 기준으로 가장 빠른 월요일 날짜를 출력한다.

    Python Programming
    from dateutil import relativedelta
    import datetime
    import calendar
    
    # 오늘 날짜를 기준으로 가장 빠른 월요일 날짜를 출력한다.
    display( datetime.date.today() + relativedelta.relativedelta(weekday=0) ) # 0은 월요일, 5 는 토요일
    
    # 오늘 날짜를 기준으로 가장 빠른 월요일 날짜를 출력한다.
    datetime.date.today() + relativedelta.relativedelta(weekday = calendar.MONDAY)

     

    Results
    datetime.date(2021, 3, 15)
    
    
    datetime.date(2021, 3, 15)

     


    2021년 3월 12일을 기준으로 가장 빠른 다음 월요일 날짜를 출력한다. 좀 더 엄밀하게는 + 7에 대하여 아래 R sqldf Packag의 case when 에 해당하는 조건문 추가 필요하다.

    Python Programming
    import datetime
    base_date = datetime.datetime.strptime('2021-03-12', '%Y-%m-%d')
    
    # 2021년 3월 12일(금요일)의 요일을 반환한다. 4 days 는 금요일을 표시한다.
    display(datetime.timedelta(base_date.weekday())) # (월요일=0, 일요일=6)
    
    # 월요일(0)과 기준일자의 요일 차이(days=-4)를 계산 후 7일을 더해준다.
    display(datetime.timedelta(0 - base_date.weekday()))
    
    base_date + datetime.timedelta(0 - base_date.weekday() + 7) # 차주 토요일 날짜를 계산한다.

     

    Results
    datetime.timedelta(days=4)
    
    datetime.timedelta(days=-4)
    
    datetime.datetime(2021, 3, 15, 0, 0)

     


    3. R Programming (R Package)

    함수를 작성하여서 오늘 날짜를 기준으로 가장 빠른 다음 토요일 날짜를 출력한다.

    R Programming
    %%R
    
    next_day <- function(x,day){
                for(y in 1:7) {
                        check_date = as.Date(x + days(y) )  #우리가 입력한 날짜에 y숫자를 더함!
                          if(format(check_date, '%A')==day) {
                            print(check_date)             }
                }
    }
    
    next_day(Sys.Date(), '토요일')

     

    Results
    [1] "2021-03-20"

     


     

    R Programming
    %%R
    
    next_day <- function(d, w) {
      d + (seq(w - 1, length = 7) %% 7 + 1L)[8 - lubridate::wday(d)] 
    }
    
    next_day(Sys.Date(), 7)  # 7 : 토요일

     

    Results
    [1] "2021-03-20"

     


    월요일(1)과 기준일자(2021년 3월 12일 금요일)의 요일 차이를 계산하여서 다음 월요일을 계산한다. 좀 더 엄밀하게는 + 7에 대하여 아래 R sqldf Packag의 case when 에 해당하는 조건문 추가 필요하다.

    R Programming
    %%R
    
    library(lubridate)
    
    # 월요일(1) ~ 토요일(6), 일요일(7)
    # 월요일(1)과 기준일자의 요일 차이(days=1)를 계산 후 7일을 더해준다.
    add_weekday <- 1 - as.numeric(format(as.Date('2021-03-12') + months(0),'%w')) + 7
    print(add_weekday)
    
    # 2021년 3월 12일을 기준으로 가장 빠른 다음 월요일 날짜를 출력한다. 
    as.Date('2021-03-12') + days(add_weekday) + weeks(0)

     

    Results
    [1] 3
    [1] "2021-03-15"

     


    4. R Dplyr Package

     


    5. R sqldf Package

    월요일(1)과 기준일자(2021년 3월 12일 금요일)의 요일 차이(day=5)를 계산하여서 다음 월요일을 계산한다.

    R Programming
    %%R
    
    sqldf("select CASE WHEN strftime('%w', DATE('2021-03-12')) = '0' THEN 'SUN' \
                       WHEN strftime('%w', DATE('2021-03-12')) = '1' THEN 'MON' \
                       WHEN strftime('%w', DATE('2021-03-12')) = '2' THEN 'TUE' \
                       WHEN strftime('%w', DATE('2021-03-12')) = '3' THEN 'WEN' \
                       WHEN strftime('%w', DATE('2021-03-12')) = '4' THEN 'THU' \
                       WHEN strftime('%w', DATE('2021-03-12')) = '5' THEN 'FRI' \
                       WHEN strftime('%w', DATE('2021-03-12')) = '6' THEN 'SAT' END WEEK_REF,     \
                       strftime('%w', DATE('2021-03-12')) weekdays,
    
                     DATE('2021-03-12', ( '1' - strftime('%w', DATE('2021-03-12')) + \
                                          CASE WHEN strftime('%w', DATE('2021-03-12')) < '1' THEN 0 ELSE 7 END) || ' day') Next_MON")

     

    Results
      WEEK_REF weekdays   Next_MON
    1      FRI        5 2021-03-15

     


    6. Python pandasql Package

     

    Python Programming
    ps.sqldf("select CASE WHEN strftime('%w', DATE('2021-03-12')) = '0' THEN '일요일' \
                          WHEN strftime('%w', DATE('2021-03-12')) = '1' THEN '월요일' \
                          WHEN strftime('%w', DATE('2021-03-12')) = '2' THEN '화요일' \
                          WHEN strftime('%w', DATE('2021-03-12')) = '3' THEN '수요일' \
                          WHEN strftime('%w', DATE('2021-03-12')) = '4' THEN '목요일' \
                          WHEN strftime('%w', DATE('2021-03-12')) = '5' THEN '금요일' \
                          WHEN strftime('%w', DATE('2021-03-12')) = '6' THEN '토요일' \
                          WHEN strftime('%w', DATE('2021-03-12')) = '7' THEN '일요일' END 요일_참고용,\
                     DATE('2021-03-12', ( '1' - strftime('%w', DATE('2021-03-12')) + \
                                          CASE WHEN strftime('%w', DATE('2021-03-12')) < '1' THEN 0 ELSE 7 END) || ' day') Next_월요일 ")

     

    Results
      요일_참고용 Next_월요일
    0 금요일 2021-03-15

     


    7. R data.table Package


    8. SAS Proc SQL

    • 월요일(2)
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select INTNX('WEEK.2', input('20210312',yymmdd8.), 1) AS NEXT_SAT FORMAT=YYMMDDN8.
        FROM   EMP(OBS=1);
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS NEXT_SAT
    1 20210315

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    
    DATA STATSAS_2;
         FORMAT NEXT_SUN NEXT_MON NEXT_TUE NEXT_WED 
                NEXT_THU NEXT_FRI NEXT_SAT YYMMDDN8.;
         NEXT_SUN = INTNX('WEEK.1', input('20210312',yymmdd8.), 1); * 이후 가장 가까운 일요일;
         NEXT_MON = INTNX('WEEK.2', input('20210312',yymmdd8.), 1); * 이후 가장 가까운 월요일;
         NEXT_TUE = INTNX('WEEK.3', input('20210312',yymmdd8.), 1); * 이후 가장 가까운 화요일;
         NEXT_WED = INTNX('WEEK.4', input('20210312',yymmdd8.), 1); * 이후 가장 가까운 수요일;
         NEXT_THU = INTNX('WEEK.5', input('20210312',yymmdd8.), 1); * 이후 가장 가까운 목요일;
         NEXT_FRI = INTNX('WEEK.6', input('20210312',yymmdd8.), 1); * 이후 가장 가까운 금요일;
         NEXT_SAT = INTNX('WEEK.7', input('20210312',yymmdd8.), 1); * 이후 가장 가까운 토요일;
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS NEXT_SUN NEXT_MON NEXT_TUE NEXT_WED NEXT_THU NEXT_FRI NEXT_SAT
    1 20210314 20210315 20210316 20210317 20210318 20210319 20210313

     


    10. Python Dfply Package

    • 오늘 날짜를 기준으로 가장 빠른 월요일 날짜를 출력한다.
    Python Programming
    from dateutil import relativedelta
    import datetime
    import calendar
    
    emp >> mutate( Next_MON   = datetime.date.today() + relativedelta.relativedelta(weekday=0),
                   Next_Mon_2 = datetime.date.today() + relativedelta.relativedelta(weekday = calendar.MONDAY)) >> \
      select(~X.job,~X.mgr,~X.sal,~X.comm) >> head()

     

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

     


     

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

    반응형

    댓글