Использовать Python для накопления значений в определенных столбцах с использованием метки времени? - PullRequest
0 голосов
/ 27 октября 2019

У меня большой текстовый файл, похожий на следующий формат:

89703   71.839532000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89704   71.840310000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89707   71.902452000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89708   71.943320000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89720   72.050930000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89722   72.051725000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89723   72.067882000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89724   72.153261000    192.168.0.24    10.0.0.5        52222   5201    1514    1500    1448
89725   72.290161000    192.168.0.24    10.0.0.5        52222   5201       0     

Второй столбец означает метку времени (например, 71,839532000 секунд), шестой-восьмой столбцы - вывод данных, который произошел вна этот раз.

Я хочу написать скрипт, который подсчитывает, сколько данных использовалось в каждом периоде 0,1 секунды для шестого столбца до восьмого столбца. Например, с 71 800 000 по 71 899 999 общее значение шестого, седьмого и восьмого столбцов составляет 3028 (1514 + 1514), 3000 (1500 + 1500) и 2896 (1448 + 1448) соответственно.

Вывод будет выглядеть примерно так:

71.8 3028 3000 2896
71.9 3028 3000 2896
72.0 4512 4500 4344
72.1 1514 1500 1448
72.2 0    0    0

Как этого добиться с помощью Python? Если это недостижимо, на каком языке мы можем использовать?

Ответы [ 2 ]

0 голосов
/ 27 октября 2019
  • Сначала я преобразовал ваши данные в CSV, чтобы вам было легче с ними работать. (Вы все еще можете использовать разделение табуляции, но я думаю, что оно преобразуется в пробелы при переполнении стека)
  • Я также добавил заголовок
a,timestamp,ip,ip2,b,c,data,d,e
89703,71.839532000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89704,71.840310000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89707,71.902452000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89708,71.943320000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89720,72.050930000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89722,72.051725000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89723,72.067882000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89724,72.153261000,192.168.0.24,10.0.0.5,52222,5201,1514,1500,1448
89725,72.290161000,192.168.0.24,10.0.0.5,52222,5201,0

Затем я использовал панд, чтопопулярная библиотека обработки данных в python.

  1. считывает данные как csv
  2. , преобразует столбец отметки времени из числа (с плавающей запятой) в отметку времени (datetime)
  3. group byвременные метки 100 микросекунд (0,1 секунды), сумма и выбор столбца данных
import pandas as pd
data = pd.read_csv("sample_data.tsv")
data.timestamp = pd.to_datetime(data.timestamp, unit='ms')
data.groupby(pd.Grouper(key='timestamp', freq='100U')).sum()["data"]

Выход

timestamp
1970-01-01 00:00:00.071800    3028
1970-01-01 00:00:00.071900    3028
1970-01-01 00:00:00.072000    4542
1970-01-01 00:00:00.072100    1514
1970-01-01 00:00:00.072200       0

Другие данные тоже есть.

>>> data.groupby(pd.Grouper(key='timestamp', freq='100U')).sum()
                                 a       b      c  data       d       e
timestamp
1970-01-01 00:00:00.071800  179407  104444  10402  3028  3000.0  2896.0
1970-01-01 00:00:00.071900  179415  104444  10402  3028  3000.0  2896.0
1970-01-01 00:00:00.072000  269165  156666  15603  4542  4500.0  4344.0
1970-01-01 00:00:00.072100   89724   52222   5201  1514  1500.0  1448.0
1970-01-01 00:00:00.072200   89725   52222   5201     0     0.0     0.0

Это также может быть записано в csv с использованием панд.

Редактировать: у меня было имя переменной a при кодировании фрагмента, затем изменил его на data при публикации.

0 голосов
/ 27 октября 2019

Это довольно простое использование такого инструмента, как awk. Вы должны быть в состоянии выбрать второй столбец, разбить его на нужный интервал и сохранить промежуточную сумму 6-го и 8-го столбцов на ведро. Что-то вроде (и я не запускал это, поэтому вам, вероятно, нужно будет отредактировать):

awk '{ sums[int($2 / 0.01)] += $6 } END { for (bucket in sums) { printf "%f sum = %f\n", bucket, sums[bucket] } }' < your_file
...