Знаю что по правилам нельзя задавать 2 вопроса, но лучше указать их в одном вопросе так как они схожие. У меня никак не получается вывести нужные мне данные. Мой код:
from pathlib import Path
print("Начало даты")
date1 = '2020-01-01'
print("Конец даты")
date2 = '2020-12-31'
import os
import pandas as pd
mylist=[]
for path in Path().glob('ot-*.log'):
if f'ot-{date1}.log' <= path.name <= f'ot-{date2}.log':
mylist.append(path.name)
import re
from datetime import datetime
with open('final.txt', 'w', encoding='utf-8') as outfile:
for fname in mylist:
file_date = fname.replace('ot-', '').replace('.log', '')
with open(fname, encoding='utf-8') as infile:
for line in infile:
outfile.write(file_date + ' ' + line)
sessions = {}
data = []
with open('final.txt', 'r', encoding='utf-8') as f:
log = f.readlines()
for line in log:
if 'Login successful' in line:
chunks = re.search(r"(.+?) Login successful from user (.+?) from .+ session=(.+?) .+", line)
login_time = datetime.strptime(chunks.group(1), '%Y-%m-%d %I:%M:%S %p')
sessions[chunks.group(3)] = {'login_time': login_time, 'username': chunks.group(2)}
elif 'Closing session' in line:
chunks = re.search(r'(.+?) Closing session.+session=(.+?) .+', line)
logout_time = datetime.strptime(chunks.group(1), '%Y-%m-%d %I:%M:%S %p')
session_id = chunks.group(2)
if session_id not in sessions:
print('Сессия {} закрыта, нет данных о входе'.format(session_id))
else:
login_time = sessions[session_id]['login_time']
username = sessions[session_id]['username']
session_time = logout_time - login_time
#print('Пользователь {} зашел в {}, вышел в {}. Время сеанса- {} . ID сессии- {}'.format(username, login_time, logout_time, session_time, session_id))
data.append([username, login_time,logout_time,session_id, session_time,session_time ])
del sessions[session_id]
df = pd.DataFrame(data, columns=['user_name', 'login', 'logout', 'session id', 'session_time','session_time_s' ])
df
Результат:
Вопрос: Как найти количество переходов сессии между сутками (если пользователь зашел в один день, а вышел в другой) и продолжительность текущей сессии (если сотрудник зашел, но в указанном промежутке времени еще не завершил сессию, в данном случае конец сессии берется 23.59 указанной даты "по")?
P.S 1- Если пользователь был несколько дней в сети количество все равно должно считаться как один (1). 2- Допустим пользователь зашел 10ого числа в 19.00, а конец даты указан 10е число, нужно чтоб он брал окончание сессии 10е число 23.59