2017-04-01 4 views
1

ログファイルは、1つの列の日付ともう1つの列の時刻だけです。私は最も人気のある時間帯を見つけようとしています。最も時間のかかるグループをグループ化して識別する

Date   Time 
Jan/01/2017 08:23:45 
Jan/01/2017 15:54:21 
Jan/02/2017 04:02:39 
Jan/03/2017 06:33:12 
... 

データを10分の部分にグループ化し、最も一般的な1時間間隔を見つける効率的な方法を探しています。

Interval    Count 
08:10:00 - 09:10:00 586 
08:20:00 - 09:20:00 565 
08:30:00 - 09:30:00 544 
... 

これは、データのGBにもスケールアップしていると私は並べ替えずに、好ましくは、最も人気のある区間を見つけることができるようにする必要があります。だから、最も人気のある1時間のインターバルのような連続しただろう可能性が高いですテーブル全体。

答えて

1

真夜中から分単位に変換し、整数除算とCounterを使用できます。データをソートする必要はありません、これは正常に動作し、効率的でなければなりません:

from collections import Counter 

log = """Jan/01/2017 08:23:45 
Jan/01/2017 15:54:21 
Jan/01/2017 15:50:21 
Jan/01/2017 15:52:21 
Jan/02/2017 04:02:39 
Jan/03/2017 06:33:12""" 

portion = 10 
interval = 60 

counter = Counter() 

for line in log.split("\n"): 
    time = line.split()[-1] 
    hour, minute, second = map(int, time.split(':')) 
    since_midnight = hour * 60 + minute 
    counter[since_midnight // portion] += 1 

for slot, count in counter.most_common(): 
    print("%02d:%02d -> %02d:%02d - %d" % ((slot * portion)/60, 
              (slot * portion) % 60, 
              ((slot + 1) * portion)/60, 
              ((slot + 1) * portion) % 60, 
              count)) 

それは出力:あなたは任意のコードを書いていなかったので

15:50 -> 16:00 - 3 
04:00 -> 04:10 - 1 
08:20 -> 08:30 - 1 
06:30 -> 06:40 - 1 

が、私はあなたに運動を残しておきます:所与の10分部分について、この部分を含む60分間隔のカウンタをインクリメントする。単純なforループで行う必要があります。

また、ファイルを1行ずつ読む必要があります。 split("\n")は単純な例のためのものでした。

0

パンダの解決策は次のようになります。 pd.read_csvを使用してログファイルをデータフレーム( "log_df")に読み込み、インデックスをdatetimeindexに設定します。

次に、グループ10分間隔でデータ

ten_minute_df = log_df.groupby(pd.TimeGrouper(freq="10T")).count().rename(columns={0:'count'}) 

は、6つの10分間隔(1時間)にわたってローリング合計を計算し、最初の時間

rolling_hour = ten_m.rolling(window=6).sum().fillna(method='bfill') 

"をバックフィル" ソート最後に、下降し、最も人口の多い10時間を示す

rolling_hour.sort_values(by='count',ascending=False).head(10) 
関連する問題