2017-11-01 8 views
2

のpython /パンダを使用して部屋与えられた入口と出口の時代に人々の数を計算し、それを左:は、私は人が部屋に入ったときの日付のリストを持っている

05/04/2017 14:20 05/04/2017 17:54 
05/04/2017 13:10 06/04/2017 07:56 
05/04/2017 10:30 05/04/2017 11:04 

だから人は14で入力されました: 20時17時54分に左。 1日13時10分に入場し、次の07:56に出発した人。

私がしたいのは、1日の特定の時間帯に部屋にいた人の数です。 14:00から15:00の間に2人の方が部屋にいました。私はこのデータをグラフ化して、異なる時間帯に部屋の人数を見ることができます。

私の質問は、この種の分析の名前はありますか、これはパンダのようなパッケージができることです。私はこれを行うためのアルゴリズム(おそらく)を書くことができますが、それを行う前に、それが「既知の問題」かどうかをチェックしたいと思っていました。

答えて

2

この種の問題は異なるアプリケーション(例えば、物理学ではmass balanceと呼ばれます)に現れますが、AFAIKには共通名がありません。しかし、その本質は単純なカウントであるため、問題を正確に解決する方法よりもアルゴリズムを書くほうが簡単です。

このコードでは、ある時間までに部屋に入ったり出たりした人の数を計算し、その後、ちょうど二から最初の減算:

import pandas as pd 
data = pd.DataFrame({'in':[10, 11, 11, 12, 14], 'out':[11, 13, 15, 14, 15]}) 
count_in = data.groupby('in')['in'].count() 
count_out = data.groupby('out')['out'].count() 
count_data = pd.concat([count_in, count_out], axis=1).fillna(0).cumsum() 
print(count_data['in'] - count_data['out']) 

コードが結果を与える:

10 1.0 
11 2.0 
12 3.0 
13 2.0 
14 2.0 
15 0.0 

それは10で1人(誰がちょうど来ていた)があったことを意味し、11でした2人(2人はもう1人が出た)など

+0

@JohnE、GROUPBY()メソッドをデータを 'in'と 'out'でそれぞれ指定するので、私の例ではソートについて心配する必要はありません。 –

0

日付のリストを含むCSVファイルがあるとします。

05/04/2017 14:20,05/04/2017 17:54 
05/04/2017 13:10,06/04/2017 07:56 
05/04/2017 10:30,05/04/2017 11:04 

各行を読んで、Pythonのdatetimeオブジェクトに各エントリを変換します。次に、Counter()を使用して、1時間ごとに各エントリをメモして終了します。日時は、分が削除された辞書キーとして使用されます。以下の時間ごとの内訳与え

from collections import Counter  
from datetime import datetime, timedelta 
import csv 

in_out = Counter() 
one_hour = timedelta(hours=1) 

with open('in_out.csv', 'r', newline='') as f_inout: 
    for row in csv.reader(f_inout): 
     in_at = datetime.strptime(row[0], "%d/%m/%Y %H:%M").replace(minute=0) 
     out_at = datetime.strptime(row[1], "%d/%m/%Y %H:%M").replace(minute=0) 
     in_out[in_at] += 1 
     in_out[out_at] -= 1 

hours = [] 
room_total = 0 

hours_range = sorted(in_out.keys())  # Use to determine start and end hours 
hour = hours_range[0] 

while hour <= hours_range[-1]: 
    room_total += in_out.get(hour, 0) 
    hours.append((hour, room_total)) 
    hour += one_hour 

for hour, room_total in hours: 
    print(hour, room_total) 

:最後に、各時間見てすべてのエントリまたは終了時間の利用可能範囲を反復処理すると、追加のデフォルトの種類によって

2017-04-05 10:00:00 1 
2017-04-05 11:00:00 0 
2017-04-05 12:00:00 0 
2017-04-05 13:00:00 1 
2017-04-05 14:00:00 2 
2017-04-05 15:00:00 2 
2017-04-05 16:00:00 2 
2017-04-05 17:00:00 1 
2017-04-05 18:00:00 1 
2017-04-05 19:00:00 1 
2017-04-05 20:00:00 1 
2017-04-05 21:00:00 1 
2017-04-05 22:00:00 1 
2017-04-05 23:00:00 1 
2017-04-06 00:00:00 1 
2017-04-06 01:00:00 1 
2017-04-06 02:00:00 1 
2017-04-06 03:00:00 1 
2017-04-06 04:00:00 1 
2017-04-06 05:00:00 1 
2017-04-06 06:00:00 1 
2017-04-06 07:00:00 0