2015-06-22 8 views
2

У меня есть файл журнала, содержащий временную метку и данные (с разделителем «,»). Я хотел бы иметь скрипт Python для анализа файла журнала, чтобы подсчитать количество данных, происходящих за каждый час.Лучший способ поиска количества часов в файле

Вот пример содержимого файла журнала:

2015-06-18 09:04:04.377,54954.418 
2015-06-18 09:04:48.863,54965.438 
2015-06-18 09:05:29.080,49.813 
2015-06-18 09:06:04.697,45.187 
2015-06-18 09:06:40.719,45.238 
2015-06-18 09:07:09.693,38.768 
2015-06-18 09:07:35.856,36.315 
2015-06-18 09:08:06.961,39.789 
2015-06-18 09:08:33.241,36.147 
2015-06-18 09:09:02.801,38.473 
2015-06-18 09:09:36.559,44.839 
2015-06-18 09:10:13.222,46.165 
2015-06-18 09:10:47.867,44.115 
2015-06-18 09:11:25.807,46.985 
2015-06-18 09:12:00.512,43.607 
2015-06-18 09:12:37.513,46.552 
2015-06-18 09:13:10.408,41.507 
2015-06-18 10:13:44.107,43.269 
2015-06-18 10:14:20.501,47.001 
2015-06-18 10:15:00.061,52.589 
2015-06-18 11:15:33.501,42.148 
2015-06-18 11:16:07.558,43.919 
2015-06-18 11:16:41.851,43.369 
2015-06-18 11:17:15.159,43.336 
2015-06-18 11:17:47.217,40.965 
2015-06-18 11:18:23.135,44.12 
2015-06-18 11:18:55.547,41.432 
2015-06-18 12:19:32.362,45.522 
2015-06-18 12:20:04.456,42.339 
2015-06-18 12:20:36.559,40.555 
2015-06-18 12:21:08.409,40.534 
2015-06-18 12:21:38.170,38.706 
2015-06-18 12:22:09.108,38.653 
2015-06-18 12:22:34.420,33.234 
2015-06-18 12:23:01.319,35.665 

Так для этого, 9 утра есть в общей сложности 17, 10 утра у 3 и так далее ... Как я могу идти о том, что делать?

+2

Что вы лично пробовали до сих пор? Пожалуйста, предоставьте минимальный рабочий пример, описывающий вашу проблему! –

+0

Правильно ли я понимаю: вы хотите подсчитывать строки с одинаковой датой и часом? – Wolf

ответ

0

это можно легко сделать с помощью панд:

import pandas as pd 
data = pd.read_csv('log.csv') 
data['time'] = pd.to_datetime(data['time']) 
data.index = data['time'] 
data['count'] = 1 
hour_count = data['count'].resample('1H',how='count') 
+0

* «Это легко сделать» * - хорошо, это выглядит не так просто. Гораздо больше понять, чем в [ответе Питера] (http://stackoverflow.com/a/30975312/2932052) – Wolf

5

Вы можете использовать collections.Counter, который похож на гистограмме.

Вас интересуют только первые 13 символов линии. Вы можете нарезать их, например:

>>> line = '2015-06-18 09:11:25.807,46.985' 
>>> line[:13] 
2015-06-18 09 

Собираем вместе:

data = """2015-06-18 09:11:25.807,46.985 
2015-06-18 09:12:00.512,43.607 
2015-06-18 09:12:37.513,46.552 
2015-06-18 09:13:10.408,41.507 
2015-06-18 10:13:44.107,43.269 
2015-06-18 10:14:20.501,47.001 
2015-06-18 10:15:00.061,52.589 
2015-06-18 11:15:33.501,42.148 
2015-06-18 11:16:07.558,43.919""" 

from collections import Counter 
c = Counter(line[:13] for line in data.split('\n')) 
print c 

Выход:

Counter({'2015-06-18 09': 4, '2015-06-18 10': 3, '2015-06-18 11': 2}) 
1

Следующая должна работать, используя простой Python и никаких дополнительных библиотек. Было бы также более удобно, если ваш CSV-файл огромен, так как вы не захотите попробовать загрузить весь файл в память.

sHour = "" 
nThisHour = 1 

with open('log.csv') as ff: 
    for line in ff: 
     sCurHour = line[11:13] 

     if sHour == sCurHour: 
      nThisHour += 1 
     else: 
      if sHour: 
       print nThisHour 

      nThisHour = 1 
      sHour = sCurHour 

    print nThisHour 

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

17 
3 
7 
8 

Срез линия может быть расширена, если дата также имеет важное значение. Это будет иметь место, если журнал не изменяется в течение дня.

+0

При условии, что временная часть временной метки действительно неактуальна. Это может быть возможно, но я сомневаюсь, что это было предназначено. – Wolf

1

Если рассматривать одни и те же данные в тот же час, как разные, что означает:

2015-06-18 09:06:04.697,45.187 
2015-06-18 09:06:40.719,45.187 

количество в два раза.

Самый простой способ:

d = defaultdict(list) 
with open(file, 'r') as f: 
    for line in f.xreadlines(): 
     d[line.strip()[:13]] += 1 
+0

* 'рассмотрите одни и те же данные в тот же час, что и разные *. Я оставил бы эту дискуссию, это запутанно, потому что вы не знаете, что означают данные, это также может быть идентификатор события. И да, остальное очень просто :-) – Wolf

+0

BTW: ['xreadlines' устарел с Python 2.3] (https://docs.python.org/release/2.3/lib/module-xreadlines.html) – Wolf

+0

спасибо за напоминание, im используя py2.7 – LittleQ

0

Здесь полный API для обработки день/час/мин/мс счетчик, также работает с пути к Teh лог-файл.

from collections import defaultdict, Counter 
import re 
import json 

def _get(pattern, line): 
    return re.findall(pattern, line) 

def get(infile, days=False, hours=True, mils=False, min_=False, sec=False): 
    days_pattern = "\d{4}\-\d{1,2}-\d{1,2}" 
    days_hours_pattern = days_pattern + "\s?\d{1,2}" 
    days_min_pattern = days_pattern + "\s?\d{1,2}:\d{1,2}" 
    day_hours_min_s_pattern = days_pattern + "\s?\d{1,2}:\d{1,2}:\d{1,2}" 
    day_hours_min_ms_pattern = day_hours_min_s_pattern + '\.\d+,\d+' 

    result = dict() 
    result['days'] = defaultdict(list) 
    result['hours'] = defaultdict(list) 
    result['ms'] = defaultdict(list) 
    result['min'] = defaultdict(list) 
    result['sec'] = defaultdict(list) 

    with open(infile) as fh: 
     for line in fh: 
      if days: 
       for cdays in _get(days_pattern, line): 
        result['days'][cdays].append(cdays) 
      if hours: 
       for chour in _get(days_hours_pattern, line): 
        result['hours'][chour].append(chour) 
      if min_: 
       for min in _get(days_min_pattern, line): 
        result['min'][min].append(min) 
      if sec: 
       for sec in _get(day_hours_min_s_pattern, line): 
        result['sec'][sec].append(sec) 
      if mils: 
       for mils in _get(day_hours_min_ms_pattern, line): 
        result['ms'][mils].append(mils) 
    summary = dict() 
    for k in result: 
     for i in result[k]: 
      summary[i] = Counter(result[k][i]) 
    return result, summary 

fin = "./in.txt" 
result, sum = get(fin, days=True, mils=True, min_=True, hours=True, sec=True) 

# works 
sum['2015-06-18'] 
sum['2015-06-18 09'] 
sum['2015-06-18 09:04'] 
sum['2015-06-18 09:04'] 
sum['2015-06-18 09:04:04'] 
sum["2015-06-18 09:04:04.377,54954"] 
Смежные вопросы