Анализ журнала между датой и временем с использованием Python - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь создать динамическую функцию: я даю два значения datetime, и он может прочитать журнал между этими значениями datetime, например:

    start_point = "2019-04-25 09:30:46.781"
    stop_point =  "2019-04-25 10:15:49.109"

Я думаю об алгоритме, который проверяет:

  1. , если даты равны:
    • проверить, больше или меньше начальный час 0 знаков (09 -> 0) или меньше, чем час останова 0 знаков (10 -> 1);
    • та же проверка с часом 1 символ ((начало) 09 -> 9, (остановка) 10 -> 0);
    • такая же проверка с минутой 0 символа;
    • тот же чек с минутой 1 символ;
  2. если даты различаются:
    • некоторые другие чеки ...

Не знаю, не изобрету ли я снова колесо, но я действительно заблудился, я перечислю вещи, которые попробовал:

1.

    ...
    cmd = subprocess.Popen(['egrep "2019-04-19 ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9].[0-9]{3}" file.log'], shell=True, stdout=subprocess.PIPE)
    cmd_result = cmd.communicate()[0]
    for i in str(cmd_result).split("\n"):
        print(i)
    ...

Проблема с этим: я добавил значения из примера, и он не мог работать, потому что у него есть недопустимые диапазоны, такие как символы часа 1, он создает диапазон [9-0], минутный символ 0, а также [3-1] и т. Д..

2.Пробовал следующие решения от Лучший способ отфильтровать журнал по диапазону дат в Python

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ

журналструктура линии:

    ...
    2019-04-25 09:30:46.781 text text text ...
    2019-04-25 09:30:46.853 text text text ...
    ...

РЕДАКТИРОВАТЬ 2

Итак, я попробовал код:

from datetime import datetime as dt

s1 = "2019-04-25 09:34:11.057"
s2 = "2019-04-25 09:59:43.534"

start = dt.strptime('2019-04-25 09:34:11.057','%Y-%m-%d %H:%M:%S.%f')
stop = dt.strptime('2019-04-25 09:59:43.534', '%Y-%m-%d %H:%M:%S.%f')

start_1 = dt.strptime('09:34:11.057','%H:%M:%S.%f')
stop_1 = dt.strptime('09:59:43.534','%H:%M:%S.%f')

with open('file.out','r') as file:
    for line in file:
        ts = dt.strptime(line.split()[1],'%H:%M:%S.%f')
        if (ts > start_1) and (ts < stop_1):
            print line

и получил ошибку

ValueError: time data 'Platform' does not match format '%H:%M:%S.%f'

ИтакКажется, я обнаружил другую проблему, которая иногда содержит не дату / время в начале строки.Есть ли способ предоставить регулярное выражение, в котором я предоставляю формат даты и времени?

EDIT 3

Исправлена ​​проблема, когда строка появляется в начале строки, которая вызывает ValueError и исправляет выход индексаошибки диапазона, когда, возможно, возникают другие значения:

try:
    ts = dt.strptime(line.split()[1],'%H:%M:%S.%f')
    if (ts > start_1) and (ts < stop_1):
        print line
except IndexError as err:
    continue
except ValueError as err:
    continue

Так что теперь он перечисляет не в диапазоне, который я предоставляю, теперь он читает журнал ОТ 2019-02-27 09:38:46.229 ДО 2019-02-28 09:57:11.028.Есть мысли?

1 Ответ

1 голос
/ 02 мая 2019

Ваша правка 2 имела правильную идею.Вам нужно включить обработку исключений, чтобы перехватить строки, которые не отформатированы правильно, и пропустить их, например, пустые строки или строки, которые не имеют метки времени.Это можно сделать следующим образом:

from datetime import datetime

s1 = "2019-04-25 09:24:11.057"
s2 = "2019-04-25 09:59:43.534"

fmt = '%Y-%m-%d %H:%M:%S.%f'

start = datetime.strptime(s1, fmt)
stop = datetime.strptime(s2, fmt)


with open('file.out', 'r') as file:
    for line in file:
        line = line.strip()

        try:
            ts = datetime.strptime(' '.join(line.split(' ', maxsplit=2)[:2]), fmt)

            if start <= ts <= stop:
                print(line)

        except:
            pass

Вся отметка времени используется для создания ts, так что ее можно было правильно сравнить с start и stop.В каждой строке сначала удаляется завершающий символ новой строки.Это раскол на пространства до двух раз.Затем первые два разделения объединяются и преобразуются в объект datetime.Если это не удается, это означает, что у вас нет правильно отформатированной строки.

...