포스팅 목차
78. Find the date of nearest Saturday after current day.
* 현재 날짜 이후 가장 빠른 토요일 날짜를 출력하시오.
- [날짜 함수] 현재 일자를 기준으로 가장 빠른 요일에 해당하는 날짜를 반환
|
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)
- string Vs Base 함수 : https://stringr.tidyverse.org/articles/from-base.html
함수를 작성하여서 오늘 날짜를 기준으로 가장 빠른 다음 토요일 날짜를 출력한다.
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
- https://en.wikibooks.org/wiki/SQL_Dialects_Reference/Functions_and_expressions/String_functions
- WEEK_REF 변수는 요일에 해당하는 숫자(일요일 : 0~토요일:7)을 비교하여서 해당 일자의 요일을 반환한다.
월요일(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 예제로 만나는 테이블 데이터 처리 방법 리스트
반응형
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[데이터 전처리- 날짜함수 예제] 특정 기간 전후 날짜 계산- 날짜 증감 - 80 (0) | 2021.08.31 |
---|---|
[데이터 전처리- 날짜함수 예제] 현재 시간 출력 - 79 (0) | 2021.08.31 |
[데이터 전처리- 날짜함수 예제] 날짜 함수를 사용한 기준월 사이의 기간(Gap) 계산 - 75 (0) | 2021.08.31 |
[데이터 전처리- 날짜함수 예제] 날짜 함수를 사용한 연령계산(나이계산) & Round 함수(반올림 함수) - 74 (0) | 2021.08.30 |
[데이터 전처리- 문자함수 예제] 코드테이블 결합과 조건문 - 73 (0) | 2021.08.30 |
댓글