Поскольку отметки времени не появляются через равные промежутки времени, вы должны использовать интерполяцию для получения наиболее точных результатов. Это также облегчит скользящее среднее. Я использую Interpolate
класс в этот ответ в коде ниже.
from time import strptime, mktime
totime = lambda x: int(mktime(strptime(x, "%d/%m/%Y %H:%M")))
with open("my_file.txt", "r") as myfile:
# Skip header
for line in myfile:
if line.startswith("DATE"):
break
times = []
values = []
for line in myfile:
date, time, value = line.split()
times.append(totime(" ".join((date, time))))
values.append(int(value))
times.reverse()
values.reverse()
i = Interpolate(times, values)
Теперь нужно просто выбрать интервалы и вычислить разницу между конечными точками каждого интервала. Давайте создадим функцию генератора для этого:
def rolling_avg(cumulative_lookup, start, stop, step_size, window_size):
for t in range(start + window_size, stop, step_size):
total = cumulative_lookup[t] - cumulative_lookup[t - window_size]
yield total / window_size
Ниже я печатаю количество подсказок в час за предыдущий час с 10-минутными интервалами:
start = totime("8/11/2011 15:30")
stop = totime("8/11/2011 20:33")
for avg in rolling_avg(i, start, stop, 600, 3600):
print avg * 3600
РЕДАКТИРОВАТЬ: Сделано totime
вернуть int и создал генератор rolling_avg
.