Как взять среднее значение за каждые 10 минут для модели django

Я использую несколько API и сохраняю их в базе данных. У меня есть одна модель под названием Station (в ней есть поле datetime и некоторые другие поля), и каждый API предназначен для одной станции. Эти API приходят от устройств, которые измеряют некоторые переменные, и они обновляются каждые 3 минуты. Поэтому я написал задачу бэкенда, которая вызывает функцию saveToDB и сохраняет их в базе данных. например:

  1. станция А "некоторые переменные" 2022/10/1 13:10
  2. станция B "некоторые переменные" 2022/10/1 13:10
  3. станция А "некоторые переменные" 2022/10/1 13:13
  4. станция B "некоторые переменные" 2022/10/1 13:13

теперь мне нужно взять среднее значение для каждой станции каждые 10 минут, 2 часа, неделю, месяц, год.

есть 30 станций. как я могу это сделать?

Если ваш вопрос заключается в том, как будет выглядеть код django для выполнения этих вычислений, вам следует прочитать об агрегации здесь. Перейдите вниз к разделу страницы "values()". Код для группировки по станциям и вычисления среднего значения всех записей будет выглядеть следующим образом:

Station.objects.values('station_id').annotate(myAverage=Avg('some_variable'))

Это группирует все записи по станциям.

Однако вы можете упростить задачу, используя вложенный цикл для выделения каждой станции и выполнения среднего значения по каждому 10-минутному интервалу. Не знаю точно, какие условия для 10-минутных интервалов вам нужны, но, допустим, вам нужны все 10 минут со вчерашнего дня. Что-то вроде:

from datetime import datetime, timedelta
from django.db.models import Avg
from .models import Station

def test():
    # get yesterday's date at midnight
    yesterday_at_midnight = datetime.today().replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(days=1)

    # add 10 minutes to the yesterday_at_midnight variable
    ten_minutes_after_midnight = yesterday_at_midnight + timedelta(minutes=10)

    # set the start time to yesterday_at_midnight
    start_time = yesterday_at_midnight
    # set the end time to ten_minutes_after_midnight
    end_time = ten_minutes_after_midnight

    # loop over each station in the database
    for s in Station.objects.all():
        # loop over the next 143 10 minute intervals (24 hours - 1 interval)
        for i in range(143):
            # find all the Station objects that fall within the current 10 minute interval
            stations = Station.objects.filter(station_id=s.station_id, created_at__gte=start_time, created_at__lt=end_time).aggregate(Avg('some_variable'))
            # do something with this QuerySet
            print(stations)
            # increment the start and end times by 10 minutes
            start_time += timedelta(minutes=10)
            end_time += timedelta(minutes=10)
Вернуться на верх