일별 데이터를 주간으로 집계하고 싶을 때 datetime,timedelta

chaechae·2023년 7월 4일
0

youtube api를 통해 각 영상별 조회수 증가폭을 보기위해서 매일 데이터를 받고 있는데, 일별로 보다 보면 그래프가 한눈에 안보인다. (물론 그냥 일주일에 한번씩 받으면 주간 데이터가 된다.ㅋㅋ )

하지만, 애초에 주어진 데이터가 일별데이터라면...
또한 시계열 데이터를 그래프로 나타내려다 보면, 일별 뿐만 아니라, 주간, 월별로 데이터를 보고싶어질때가 있다. 대표적으로 주식??

아래는 저번에 shift 함수를 이용해 일일 조회수 증가량 view_count_diff 를 추가한 데이터 의 일부입니다.

아래처럼 아무래도 데이터는 계속 추가되기 때문에 계속 일별로 그래프로 표현하기에는 한계가 있다. 그래서 주간별로 조회수 증가량을 볼 수 있도록 데이터를 전처리해보자!

💻 python

# filtered_df  데이터
import datetime
import pandas as pd

new_df = filtered_df.copy()  # filtered_df의 복사본 생성
new_df['down_at'] = pd.to_datetime(filtered_df['down_at'], format='%Y-%m-%d')
new_df['week_start'] = new_df['down_at'] - pd.to_timedelta(new_df['down_at'].dt.dayofweek, unit='d')
weekly_df = new_df.groupby(['video_id', 'week_start'])['view_count_diff'].sum().reset_index() # video_id 와 week_start 가 index로 가버리기 때문에 rest_index() 필요
# weekly_df['week_start'] = pd.to_datetime(weekly_df['week_start']).dt.strftime('%m-%d')
  • 날짜를 이용해서 데이터를 조회하기 때문에, down_at열의 값을 datetime형식으로 변환필요
  • new_df['week_start'] =
    pd.to_timedelta() 함수를 사용하여 일(day) 수를 뺀 값으로 계산합니다. 이때, unit 매개변수를 사용하여 일(day)을 나타내는 문자열을 지정합니다.
  • video_id 와 week_start 그룹로 view_count_diff 를 집계(sum)해주면 끝!

down_at 컬럼에 pd.to_timedelta(new_df['down_at'].dt.dayofweek, unit='d') 를 빼주면 아래와 같이 해당 down_at(다운받은 날짜)의 첫 주가 기록된다.

video_id, week_start 별로 그룹해주면 끝!

이제 해당 데이터를 본인의 입맛대로 시각화 하면된다! 저는 nivo_chart를 이용했습니다.


datetime, timedelta

  • datetime.now 현재 시간을 알리는 함수
  • tiemdelta 날짜 차이
now = datetime.datetime.now() 

#현재시간을 년-월-일 로
today = pd.to_datetime(now_time, format='%Y-%m-%d') 
print(today)
> 2023-08-29 00:00:00

# datetime 타입에서 하루를 빼고싶을때?
# pd.Timedelta 를 이용하면된다. 
yesterday = today - pd.Timedelta(days=1)
> 2023-08-28 00:00:00

# 물론 1주일 도 가능하다
# day 대신 weeks 를 넣어주면 된다. months 도 마찬가지겠지?
last_week = today - pd.Timedelta(weeks=1)
profile
다양한 컨텐츠가 있는 곳을 좋아합니다. 시리즈를 참고하시면 편하게 글을 보실 수 있습니다🫠

0개의 댓글