Я собираю информацию о дорожном движении для специального случая использования, где у меня ок. через каждые 10 минут (но не точно) а временной меткой значение счетчика трафика, таких как:Создание сводной статистики из временных счетчиков трафика
11:45 100
11:56 110
12:05 120
12:18 130
...
Это данные есть, но я не могу улучшить это.
Я хотел бы получить некоторую статистику почасового/дневного времени с этого входа, не могли бы вы предложить некоторые готовые функции или алгоритмы в python?
Я подумываю о том, чтобы вставить часы с меткой времени в часы и взять первую временную метку для часа против последней и показать разницу в потоке движения в заданный час, однако, поскольку это может начаться не точно с часом (например, с приведенными выше данными, он начинается с 120 @ 12:05), он может быть совершенно выключен, и было бы неплохо включить также пропорционально предыдущие данные (например, ((120-110)/9) * 5). Однако я не хочу изобретать велосипед.
- ОБНОВЛЕНИЕ -
Основываясь на приведенных ниже предложений, которые я смотрел в панд и производства код, приведенный ниже. В качестве пояснения к вышеуказанному письменному фону временные значения являются второстепенными и распределены нерегулярно в течение минуты (например, 11:45:03, 11:56:34 и т. Д.). Таким образом, приведенный ниже код берет ввод, переиндексирует его на второй уровень, выполняет линейную интерполяцию (при условии, что трафик равномерно распределяется между точками измерения), сокращает первую и последнюю дробные минуты (так что если 1-я точка данных находится в 11:45 : 03, он не искажается отсутствием первых 3 секунд) и перевыпускает данные второго уровня на минутный уровень. Это работает, как ожидалось, однако это очень медленно, я думаю, из-за интерполяции второго уровня, поскольку данные охватывают месяцы. Любые идеи по дальнейшему улучшению или ускорению кода?
import datetime
import pandas as pd
import numpy as np
import math
COLUMNS = ['date', 'lan_in', 'inet_in', 'lan_out', 'inet_out']
ts_converter = lambda x: datetime.datetime.fromtimestamp(int(x))
td = pd.read_table("traffic_log",
names = COLUMNS,
delim_whitespace = True,
header = None,
converters = { 'date' : ts_converter }).set_index('date')
# reindex to second-level data
td = td.reindex(pd.date_range(min(td.index), max(td.index), freq="s"))
# linear interpolation to fill data for all seconds
td = td.apply(pd.Series.interpolate)
# cut first and last fractional minute data
td = td[pd.Timestamp(long(math.ceil(td.index.min().value/(1e9*60))*1e9*60)):
pd.Timestamp(long(math.floor(td.index.max().value/(1e9*60))*1e9*60))]
# resample to minute-level taking the minimum value for each minute
td = td.resample("t", how="min")
# change absolute values to differences
td = td.apply(pd.Series.diff)
# create daily statistics in gigabytes
ds = td.resample("d", how="sum").apply(lambda v: v/1024/1024/1024)
# create speed columns
for i in COLUMNS[1:]:
td[i+'_speed'] = td[i]/60/1024
Использовать обычные http://pandas.pydata.org/ – YXD