Django/Python实现按月份查询指定日期范围内的统计数据
实现方案
依赖引入
首先导入需要用到的模块:
import datetime import calendar # 引入Django对应的模型,以及你需要的ORM方法,比如求和用的Sum from django.db.models import Sum from .models import YourDataModel # 替换为你实际的业务模型类
核心代码实现
直接复用下面的函数即可,逻辑已经覆盖单月、跨月、跨年的场景:
def get_monthly_split_data(start_date_str: str, end_date_str: str) -> list: # 字符串格式日期转date对象 start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d").date() end_date = datetime.datetime.strptime(end_date_str, "%Y-%m-%d").date() result = [] current_cursor = start_date while current_cursor <= end_date: # 获取当前月的最大天数 _, max_day_of_month = calendar.monthrange(current_cursor.year, current_cursor.month) current_month_end = datetime.date(current_cursor.year, current_cursor.month, max_day_of_month) # 确定当前月的实际查询截止日期,取当月最后一天和总结束日期的较小值 query_end_date = min(current_month_end, end_date) # 当前月的查询起始日期 query_start_date = current_cursor # ------------------- 替换为你自己的数据拉取逻辑 ------------------- # 示例:统计对应时间段内的销售额总和 monthly_data = YourDataModel.objects.filter( record_date__range=(query_start_date, query_end_date) ).aggregate(total_sales=Sum('sales_amount'))['total_sales'] or 0 # 如果要返回完整数据集,直接写 YourDataModel.objects.filter(record_date__range=(...)).all() 即可 # ---------------------------------------------------------------- # 转成小写英文月份名,比如5月对应may month_en_name = current_cursor.strftime("%B").lower() result.append({ "month": month_en_name, "data": monthly_data }) # 游标跳到下一个月的1号 current_cursor = current_month_end + datetime.timedelta(days=1) return result
调用示例
start_date = '2021-5-5' end_date = '2021-6-5' result = get_monthly_split_data(start_date, end_date) print(result)
输出完全符合你要求的格式。
可选优化
如果你已经安装了python-dateutil第三方库,跳转下一个月的逻辑可以写得更简洁,适合复杂的跨期场景:
from dateutil.relativedelta import relativedelta # 把游标跳转的代码替换为下面的写法即可 current_cursor = datetime.date(current_cursor.year, current_cursor.month, 1) + relativedelta(months=1)
内容的提问来源于stack exchange,提问作者nerd_geek365
相关产品推荐
相关产品推荐

