안녕하세요.
오늘은 기간 별 회원가입자 수를 확인하는 미션을 해결해보겠습니다.
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
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
'Web > Django' 카테고리의 다른 글
DRF Swagger ImageField Request Samples 에 안보이는 문제 (0) | 2020.06.23 |
---|---|
Django 삽질기 쿼리 지연? (0) | 2020.06.15 |
Django - RESTful 한 API 만들기 (0) | 2020.04.21 |
Django - Multiple databases(using, inspectdb) (0) | 2020.04.20 |
Django - 1월~12월까지의 데이터 가져오면서 변수명 만들기 (0) | 2020.04.20 |
댓글