Django - 기간 별 회원가입자 수 가져오기
Web/Django

Django - 기간 별 회원가입자 수 가져오기

뉴비뉴 2020. 4. 22.

안녕하세요.

 

오늘은 기간 별 회원가입자 수를 확인하는 미션을 해결해보겠습니다.

 

Member 테이블 안에 date_joined 라는 필드가 있습니다.

 

#1 filter range

기간 별 회원가입자 수를 가져오기 위해서 꼭 필요한 조건 입니다.

import pandas
from datetime import datetime


start_date = request.query_params.get('from_date')  # '2020-04-01'
end_date = request.query_params.get('to_date')  # '2020-04-15'

dates = AppAccount.objects.using('account').filter(
	date_joined__range=[start_range, end_range + timedelta(days=1)]  # end_range를 +1
).values_list('date_joined', flat=True).order_by('date_joined')

date_joined 필드를 대상으로 start_date와 end_date 사이의 데이터를 가져옵니다.

주의할 점은 Pyhton range와 똑같다고 생각하면 되기 때문에 끝 날짜를 +1 해주어야 합니다.

 

하지만 제가 원하는 값은 기간 별 회원가입자 수 입니다.

dates 에는 날짜별 몇명이 회원가입 했는지 나와있지 않고, date_joined가 오름차순 된 Queryset이 들어있을 겁니다.

 

#2 pandas

기간을 출력해주어야 합니다.

 

2020-04-01 ~ 2020-04-15 를 입력하면 2020-04-01, 2020-04-02, 2020-04-03, . . .와 같은 데이터가 출력되어야 합니다.

그 이유는 Response를 줄 때 Key: Value로 Key에는 기간이 들어가게 해주기 위함과 Filter 시에 날짜별로 회원가입자 수를 Count할 때 필요하기 때문입니다.

 

date_range()

pandas.date_range()는 start와 end를 입력하면 start와 end 사이의 날짜를 가져와줍니다.

get_date = request.query_params.get('date')
start_date = request.query_params.get('from_date')
end_date = request.query_params.get('to_date')

from_to = pandas.date_range(start_date, end_date)  # 2020-04-01 ~ 2020-04-15 까지의 기간
from_to_list = from_to.strftime("%Y-%m-%d").tolist()  # 날짜 포맷팅을 지정
start_range = from_to_list[0]  # 0번 째가 가장 첫번 째 데이터이기 때문에 start로 지정
end_range = datetime.strptime(from_to_list[-1], '%Y-%m-%d')  # 추후 연산을 위해서 datetime으로 지정

datelist = []

d1 = date(int(start_date.split('-')[0]), int(start_date.split('-')[1]), int(start_date.split('-')[2]))  # 스타트 년,월,일
d2 = date(int(end_date.split('-')[0]), int(end_date.split('-')[1]), int(end_date.split('-')[2]))  # 엔드 년,월,일

delta = d2 - d1  # 기간 사이의 범위를 계산

dates = AppAccount.objects.using('account').filter(
	date_joined__range=[start_range, end_range + timedelta(days=1)]  # end_range +1
).values_list('date_joined', flat=True).order_by('date_joined')

for i in range(delta.days + 1):  # range +1
	filtered_list = datetime.strftime(d1 + timedelta(days=i), '%Y-%m-%d')  # start에 day를 +1 씩 넣어 list에 저장시킨다.
	date_count = dates.filter(date_joined__contains=filtered_list).count()  # contains 2020-04-10가 포함된 것들을 다 가져온다.
	datelist.append({filtered_list: date_count})  # [{'2020-04-01': 6} . . .] 의 형태로 저장

참조 URL

https://hashcode.co.kr/questions/3118/python-%EC%9D%BC%EC%A0%95-%EA%B8%B0%EA%B0%84%EC%9D%98-%EB%82%A0%EC%A7%9C-%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95

 

python 일정 기간의 날짜 출력 방법

python을 가지고 일정 기간의 날짜를 출력하고자 합니다.예를 들면 20160901부터 20161031까지입니다.하지만 단순히 range를 가지고 date1 = int('20160901') date2 = int('20161032') for x in range(date1, date2): print x 이렇게 사용하는 경우에는 9월은 30일까지 있으나, 20160901 ...

hashcode.co.kr

https://itinerant.tistory.com/1

 

[Python] 문자로 받은 두 날짜 사이의 날짜 리스트 구하기

[Python] 문자로 받은 두 날짜 사이의 날짜 리스트 구하기 from datetime import date, timedelta sdate = "2018-01-01" # start date edate = "2018-01-10" # end date d1 = date(int(sdate.split('-')[0]), int(..

itinerant.tistory.com

 

댓글

💲 추천 글