더보기
데이터를 다루다보면 날짜를 다룰 일이 정말 많다.
그때 사용하게 되는 것이 표준 라이브러리인 Datetime인데,
간단한 듯 하면서 계속 기억이 안나고,, 찾아보게 된다.
간단한 듯 하면서 계속 기억이 안나고,, 찾아보게 된다.
그래서 다시 찾지 않겠다는 마음으로 정리해보려 한다.
개념적인 내용보다는 많이 사용하는 포인트를 기록!
▼ 날짜에 더하기 빼기
가장 많이 사용하게 되는 로직이 이 날짜에서 5일 후, 일주일 전 날짜 계산해줘! 이다.
이때 사용하게 되는게 datetime의 timedelta이다.
from datetime import timedelta, date
basic_date = date.today()
하루 뒤 = basic_date + timedelta(days=1)
일주일 전 = basic_date - timedelta(weeks=1)
▼ PySpark 날짜 다루기
pyspark에서는 방식이 또 다르다.
secdate = timedelta(int(opendate)) + timedelta(7)
secdate = str(secdate).split(' ')[0]
open_audi_df.select('OPEN_AUDI_CNT', 'STD_DATE',
date_add('STD_DATE', 7)).show()
movie_detail_sec_audi_df = movie_detail.join(
movie_box_office, on=['MOVIE_CODE', 'MOVIE_NAME'], how='left')
sec_audi_df = movie_detail_sec_audi_df.select('MOVIE_CODE', movie_detail_open_audi_df.AUDI_CNT.alias('SEC_AUDI_CNT'))\
.where(movie_detail_open_audi_df.STD_DATE == '20220802')
# .where(movie_detail_open_show.OPEN_DATE == secdate)
audi_df = open_audi_df.join(
sec_audi_df, on=['MOVIE_CODE'], how='left')
audi_df.select('MOVIE_CODE', 'MOVIE_NAME', 'OPEN_AUDI_CNT', ((
audi_df.SEC_AUDI_CNT-audi_df.OPEN_AUDI_CNT)/audi_df.OPEN_AUDI_CNT).alias('SEC_AUDI_INCREASE')).show()
movie_detail = movie_detail.to_pandas_on_spark()
for dt in movie_detail.values:
print(dt)
cls.movie_codes.append(dt[0])
cls.movie_names.append(dt[1])
cls.open_dates.append(dt[2])
for i in range(len(cls.movie_codes)):
code = cls.movie_codes[i]
opendate = cls.open_dates[i]
secdate = timedelta(int(opendate)) + timedelta(7)
secdate = str(secdate).split(' ')[0]
taget_table = movie_box_office.select('MOVIE_CODE', 'STD_DATE', 'AUDI_CNT') \
.where((movie_box_office.MOVIE_CODE == code))
# open_audi = taget_table.select('AUDI_CNT') \
# .where(DBO_table.STD_DATE == opendate).collect()
open_audi = taget_table.select('AUDI_CNT') \
.where(movie_box_office.STD_DATE == '20220801').collect()
open_audi_cnt = open_audi[0]['AUDI_CNT']
print(type(open_audi_cnt), open_audi_cnt)
cls.open_audi_cnts.append(open_audi_cnt)
# sec_audi = taget_table.select('AUDI_CNT') \
# .where(DBO_table.STD_DATE == secdate).collect()
sec_audi = taget_table.select('AUDI_CNT') \
.where(movie_box_office.STD_DATE == '20220802').collect()
sec_audi_cnt = sec_audi[0]['AUDI_CNT']
print(type(sec_audi_cnt), sec_audi_cnt)
increase_ratio = round(
((sec_audi_cnt - open_audi_cnt) / open_audi_cnt * 100), 3)
print(increase_ratio)
cls.increase_ratios.append(increase_ratio)
MA_df = pd.DataFrame({
'MOVIE_CODE': cls.movie_codes,
'MOVIE_NAME': cls.movie_names,
'OPEN_AUDI_CNT': cls.open_audi_cnts,
'SEC_AUDI_INCREASE': cls.increase_ratios
})
MA_df = get_spark_session().createDataFrame(MA_df)
hit_df = movie_hit.select('MOVIE_CODE', 'HIT_GRADE')
movie_audi_df = MA_df.join(hit_df, on='MOVIE_CODE', how='left')
save_data(DataMart, movie_audi_df, 'MOVIE_AUDI')
728x90
'프로그래밍 > Python' 카테고리의 다른 글
[Python] 도로명 주소 위도,경도로 전환하기 (지오코딩) (0) | 2022.11.02 |
---|---|
[Pandas] 빈 Dataframe생성 및 데이터 행 삽입 (0) | 2022.10.18 |
[Python] 'ResultSet' object is not callable 에러 해결 (0) | 2022.08.23 |
[Python] folium 지도 그리기 (iframe 속성) (0) | 2022.08.20 |
[Pandas] 데이터프레임 인덱스 새로 설정하기(내포for문) (0) | 2022.08.20 |