You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:06:03