Начните с определения следующей функции:
def counts(grp):
codeList = ['500', '502', '503']
return pd.Series([np.count_nonzero(grp.eq(code)) for code in codeList],
index=map(lambda x: 'Err_' + x, codeList))
В ближайшее время она будет применена к каждой группе, полученной в результате повторной выборки вашего DataFrame.
Считайте ваш файл следующим образом:
df = pd.read_csv('your_log.csv', names=['Date', 'Message'],
skipinitialspace=True, parse_dates=[0])
Примечание параметр skipinitialspace , необходимый для удаления начального пробела после каждой запятой (после даты / времени).
Затем выполните: df.Date = df.Date.dt.tz_localize(None)
, чтобы удалить часть часового пояса ( + 0000 ) из результата.
Поскольку сравнение полных строк неудобно, я решил сравнивать только коды ошибок (3 начальных символа каждого сообщения). Для этого давайте создадим новый столбец с просто кодами ошибок:
df['Code'] = df.Message.str.slice(0,3)
Следующим шагом будет создание количества ошибок в каждом часе путем повторной выборки и применения вышеуказанной функции к каждой часовой группе:
errCnt = df.resample('1H', on='Date').Code.apply(counts).unstack(level=1)
Если вам нужно другое разрешение по времени, измените 1H на желаемый период.
И последний шаг - добавление столбца Total ( если вам это нужно):
errCnt['Total'] = errCnt.sum(axis=1)
Для моих образцов данных (с некоторыми ошибками, в более коротком периоде) я получил:
Err_500 Err_502 Err_503 Total
Date
2020-01-06 02:00:00 1 0 0 1
2020-01-06 03:00:00 0 0 0 0
2020-01-06 04:00:00 0 0 0 0
2020-01-06 05:00:00 1 2 2 5
2020-01-06 06:00:00 0 0 0 0
2020-01-06 07:00:00 1 0 0 1
2020-01-06 08:00:00 1 0 0 1