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()
'TIL' 카테고리의 다른 글
[240214] 파이차트: 기준값 추가 / 막대그래프: X축 이름 및 간격 변경 (0) | 2024.02.14 |
---|---|
[240213] 유저ID와 방문시작시간으로 세션ID/평균세션시간 생성(feat. ECDF) (0) | 2024.02.14 |
[240207] 문자열, 숫자 데이터 타입 변환(astype, to_numeric) (0) | 2024.02.08 |
[240206] 중첩 딕셔너리? JSON 포맷 데이터프레임으로 평면화 (0) | 2024.02.06 |
[240205] SQL: 코드카타 119~121 & 파이썬: 코드카타 29~30 (0) | 2024.02.05 |