본문 바로가기

TIL

[240208] 날짜 데이터 타입 변환 및 처리(to_datetime, datetime)

1. 문제 배경

- POSIX 시간대(ex. 1472830385)로 처리된 날짜 칼럼을 년/월/일/시/분/초(ex.2016-08-01 07:00:12) 형식으로 변경 

- 년/월/일별 분석을 위해 원하는 날짜나 시간대 등을 추출하는 작업 필요 

 

2. 날짜형 데이터 타입 변경

- POSIX 시간은 UTC(협정 세계시) 기준 1970년 1월 1일 00:00:00 이후 경과한 초를 정수로 나타낸 시간대 

└ UNIX 시간(UNIX time), Epoch 시간이라고 부르기도 함 

- pd.to_datetime으로 데이터 타입 변경

└ format으로 칼럼 값의 형식을 지정한 뒤 날짜 형태로 출력 

└ unit은 숫자에 대한 인수의 단위로 기본 값은 ns(나노 초). 초('s')로 지정하여 정수형 시간대를 날짜 형태로 출력 

# datetime으로 변환: 'date' (str > int > datetime)
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df['visitStartTime'] = pd.to_datetime(df['visitStartTime'], unit='s')

 

- time 모듈 활용한 데이터 타입 변경 예시

import time
tm = time.gmtime(1472865386)
# time.struct_time(tm_year=2016, tm_mon=9, tm_mday=3, tm_hour=1, tm_min=16, tm_sec=26, tm_wday=5, tm_yday=247, tm_isdst=0)

time.localtime(1472865386)
# time.struct_time(tm_year=2016, tm_mon=9, tm_mday=3, tm_hour=10, tm_min=16, tm_sec=26, tm_wday=5, tm_yday=247, tm_isdst=0)

time.strftime('%Y-%m-%d %I:%M:%S %p', tm)
# '2016-09-03 01:16:26 AM'

time.ctime(1472865386)
#'Sat Sep  3 10:16:26 2016'

* time 모듈 관련 출처: https://www.daleseo.com/python-time/

 

3. 날짜형 데이터 처리

 - datetime 모듈을 활용해 datetime 타입으로 변환된 칼럼을 원하는 날짜 및 시간 단위로 추출 

- 년월(2016-09) 식으로 일부 값만 추출을 원할 때는 'dt.strftime()' 함수를 활용해 추출을 원하는 형식 지정 

import datetime as dt 

visit_year = df['visitStartTime'].dt.year
visit_month = df['visitStartTime'].dt.month
visit_ym = df['visitStartTime'].dt.strftime('%Y-%m')
visit_ymd = df['visitStartTime'].dt.strftime('%Y-%m-%d')
visit_day = df['visitStartTime'].dt.day
visit_day = df['visitStartTime'].dt.day
visit_dayofweek = df['visitStartTime'].dt.weekday # 월요일이 0 
visit_week = df['visitStartTime'].dt.strftime('%Y-%W') #몇번째주차인지

 

- 년월 별로 그룹핑한 데이터 시각화 예시 

# 날짜별로 유저수, 구매수 확인 
main_variable = ['fullVisitorId', 'totals.transactionRevenue']
cnt_by_month = (df.groupby([visit_ym])[main_variable].count()).reset_index()

user_cnt_by_month = df.groupby([visit_ym])['fullVisitorId'].count()
purchase_cnt_by_month = df.groupby([visit_ym])['totals.transactionRevenue'].count()
cvr_by_month = (purchase_cnt_by_month / user_cnt_by_month)*100

# 그래프 그리기
plt.figure(figsize= (25,7))
plt.subplot(1, 3, 1)
sns.lineplot(data=user_cnt_by_month)
plt.title('Number of Monthly User')
plt.xticks(range(0, 13, 2))
plt.xlabel('Month')
plt.ylabel('Number of User')

plt.subplot(1, 3, 2)
sns.lineplot(data=purchase_cnt_by_month)
plt.title('Number of Monthly Purchase')
plt.xticks(range(0, 13, 2))
plt.xlabel('Month')
plt.ylabel('Number of Purchase')

plt.subplot(1, 3, 3)
sns.lineplot(data=cvr_by_month)
plt.xticks(range(0, 13, 2))
plt.title('Monthly CVR')
plt.xlabel('Month')
plt.ylabel('CVR')
plt.show()