2010-11-11 2 views
1

Я пытаюсь сгенерировать отчет для статистики использования. Ниже приведены примеры данных, которые у меня есть в массиве, и это извлекается из таблицы Mysql. Как реализовать логику, говорящую, что если пользователь простаивает более 30 минут, он не использовал систему, чтобы вычислить среднее время использования.Python - генерировать разницу во времени

timestamp=[] 
for i in timestamp: 
    print i 

     2010-04-20 10:07:30 
     2010-04-20 10:07:38 
     2010-04-20 10:07:52 
     2010-04-20 10:08:22 
     2010-04-20 10:08:22 
     2010-04-20 10:09:46 
     2010-04-20 10:10:37 
     2010-04-20 10:10:58 
     2010-04-20 10:11:50 
     2010-04-20 10:12:13 
     2010-04-20 10:12:13 
     2010-04-20 10:25:38 
     2010-04-20 10:26:01 
     2010-04-20 10:26:01 
     2010-04-20 10:26:06 
     2010-04-20 10:26:29 
     2010-04-20 10:26:29 
     2010-04-20 10:26:35 
     2010-04-20 10:27:21 
     2010-04-20 01:32:46 
     2010-04-20 01:32:47 
     2010-04-20 01:32:57 
     2010-04-20 01:32:59 
     2010-04-20 01:33:03 
     2010-04-20 01:33:03 
     2010-04-20 01:33:05 
     2010-04-20 01:33:11 
     2010-04-20 01:33:15 
     2010-04-20 01:34:49 
     2010-04-20 01:34:55 
     2010-04-20 01:35:02 
     2010-04-20 01:35:17 
     2010-04-20 01:35:20 
     2010-04-20 01:36:49 
     2010-04-20 01:36:52 
     2010-04-20 01:36:52 
     2010-04-20 01:37:11 
     2010-04-20 01:37:15 
     2010-04-20 01:37:17 
     2010-04-20 01:50:11 
     2010-04-20 01:50:15 
     2010-04-20 01:50:18 
     2010-04-20 01:50:20 
     2010-04-20 01:50:33 
     2010-04-20 01:50:36 
     2010-04-20 01:51:56 
+0

Что именно представляет собой этот список временных меток? Время, когда они вошли в вашу систему? Время они вышли из системы? И то и другое? Видя, как некоторые из этих времен находятся всего в нескольких минутах друг от друга, может быть, в последний раз они выполняли определенное действие с системой? – WiseGuyEh

+0

@WiseGuyEh: Записан «Да», «Выход из системы» может быть в этом случае есть массив ссылок, у которого есть вход в систему, еще не выведенный из системы, только что закрыл браузер или не обратился к пользовательскому интерфейсу – Hulk

ответ

3

Я думаю, что это то, что вы хотите. Он проходит через список, вычисляющий разницу между каждой записью и предыдущей. Если разница больше или равна 30 минутам, она игнорирует ее. Если он составляет менее 30 минут, он добавляет его к общему использованию для этого пользователя. (Я предполагаю, что все временные метки являются для одного пользователя.)

from datetime import datetime,timedelta 

# Convert the timestamps to datetime objects 
usetimes = sorted(datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in timestamp) 

# Set the idle time to compare with later 
idletime = timedelta(minutes = 30) 

# Start the running total with a timedelta of 0 
usage = timedelta() 
last = usetimes[0] 

for d in usetimes[1:]: 
    delta = d - last 
    if delta < idletime: 
     usage += delta 
    last = d 

print "total usage:",usage 

Если вы хотите использовать sum() и zip() вы можете сократить строки кода, но я не уверен, если это так читаем:

from datetime import datetime,timedelta 
usetimes = sorted(datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in timestamp) 
idletime = timedelta(minutes = 30) 
usage = sum((x - y for x,y in zip(usetimes[1:],usetimes[:-1]) if x - y < idletime),timedelta()) 
print "total usage:", usage 

В этом случае, если список меток времени очень долго вы могли бы рассмотреть вопрос об использовании izip из itertools вместо zip.

+0

. Я ожидал бы, что вы узнаете лучше, чем передать описание списка 'sorted': он уничтожает память _and_ двух символов. – aaronasterling

+0

@aaronasterling Не уверен, как он «сохраняет персонажей», так как вам нужно будет делать 'usetimes = [...]; usetimes.sort() '. Я думаю, что использование 'sorted' в этом случае более читаемо. –

+0

@Dave, я имел в виду, что он должен быть отсортирован (datetime.strptime (...) для d в timestamp) 'На самом деле вам не нужно создавать список, чтобы просто выбросить его после создания его копии. – aaronasterling

Смежные вопросы