2016-07-30 1 views
0

私はパンダのデータフレームに読み込まれた私の週刊カレンダー(明らかに被疑者を無防備に変えました)の詳細を持っています。私の目標の1つは、会議で合計時間を得ることです。私は、データフレームをdate_rangeで索引をつけて、その時間帯に会議に参加した分の合計数を示す週の時間帯別頻度を付けたいと思います。私の最初の課題は、会議が重複し、一度に2つの場所にいたいと思うほど、私は確かにそうではありません。私は1つから別のものに飛び乗る。たとえば、インデックス8と9の行は、私がdf ['Duration']。sum()を列にした場合のように、合計会議時間が90分で、120分ではありません。オーバーラップを1回だけカウントするには、データフレーム内の期間をどのように平準化しますか? date_rangeとピリオドを使ってどこかに答えがあるようですが、私はその周りを頭で囲むことができません。以下は私のデータフレームdfです。Python Pandasはミーティングが重複しているカレンダーを平らにして会議の実際の時間を取得します

   Start    End Duration Subject 
0 07/04/16 10:30:00 07/04/16 11:00:00 30  Inspirational Poster Design Session 
1 07/04/16 15:00:00 07/04/16 15:30:00 30  Corporate Speak Do's and Don'ts 
2 07/04/16 09:00:00 07/04/16 12:00:00 180  Metrics or Matrix -Panel Discussion 
3 07/04/16 13:30:00 07/04/16 15:00:00 90  "Do More with Less" kickoff party 
4 07/05/16 09:00:00 07/05/16 10:00:00 60  Fiscal or Physical -Panel Discussion 
5 07/05/16 14:00:00 07/05/16 14:30:00 30  "Why we can't have nice thing" training video 
6 07/06/16 15:00:00 07/06/16 16:00:00 60  One-on-One with manager -Panel Discussion 
7 07/06/16 09:00:00 07/06/16 10:00:00 60  Fireing for Performance leadership session 
8 07/06/16 13:00:00 07/06/16 14:00:00 60  Birthday Cake in the conference room *MANDATORY* 
9 07/06/16 12:30:00 07/06/16 13:30:00 60  Obligatory lunchtime meeting because it was the only time everyone had avaiable 

ご協力いただければ幸いです。

編集: これは私が上記のデータセットで期待している出力です。

2016-07-04 00:00:00 0 
2016-07-04 01:00:00 0 
2016-07-04 02:00:00 0 
2016-07-04 03:00:00 0 
2016-07-04 04:00:00 0 
2016-07-04 05:00:00 0 
2016-07-04 06:00:00 0 
2016-07-04 07:00:00 0 
2016-07-04 08:00:00 0 
2016-07-04 09:00:00 60 
2016-07-04 10:00:00 60 
2016-07-04 11:00:00 60 
2016-07-04 12:00:00 0 
2016-07-04 13:00:00 30 
2016-07-04 14:00:00 60 
2016-07-04 15:00:00 30 
2016-07-04 16:00:00 0 
2016-07-04 17:00:00 0 
2016-07-04 18:00:00 0 
2016-07-04 19:00:00 0 
2016-07-04 20:00:00 0 
2016-07-04 21:00:00 0 
2016-07-04 22:00:00 0 
2016-07-04 23:00:00 0 
2016-07-05 00:00:00 0 
2016-07-05 01:00:00 0 
2016-07-05 02:00:00 0 
2016-07-05 03:00:00 0 
2016-07-05 04:00:00 0 
2016-07-05 05:00:00 0 
2016-07-05 06:00:00 0 
2016-07-05 07:00:00 0 
2016-07-05 08:00:00 0 
2016-07-05 09:00:00 60 
2016-07-05 10:00:00 0 
2016-07-05 11:00:00 0 
2016-07-05 12:00:00 0 
2016-07-05 13:00:00 0 
2016-07-05 14:00:00 30 
2016-07-05 15:00:00 0 
2016-07-05 16:00:00 0 
2016-07-05 17:00:00 0 
2016-07-05 18:00:00 0 
2016-07-05 19:00:00 0 
2016-07-05 20:00:00 0 
2016-07-05 21:00:00 0 
2016-07-05 22:00:00 0 
2016-07-05 23:00:00 0 
2016-07-06 00:00:00 0 
2016-07-06 01:00:00 0 
2016-07-06 02:00:00 0 
2016-07-06 03:00:00 0 
2016-07-06 04:00:00 0 
2016-07-06 05:00:00 0 
2016-07-06 06:00:00 0 
2016-07-06 07:00:00 0 
2016-07-06 08:00:00 0 
2016-07-06 09:00:00 60 
2016-07-06 10:00:00 0 
2016-07-06 11:00:00 0 
2016-07-06 12:00:00 30 
2016-07-06 13:00:00 60 
2016-07-06 14:00:00 0 
2016-07-06 15:00:00 60 
2016-07-06 16:00:00 0 
2016-07-06 17:00:00 0 
2016-07-06 18:00:00 0 
2016-07-06 19:00:00 0 
2016-07-06 20:00:00 0 
2016-07-06 21:00:00 0 
2016-07-06 22:00:00 0 
2016-07-06 23:00:00 0 
2016-07-07 00:00:00 0 
+0

あなたが希望/予想データセットを投稿できますか? – MaxU

+0

予想される出力を追加しました。ありがとう! – James

答えて

1

一つの可能​​性は、あなたがその分中、会議中であるかどうかのトラックを保つ分でインデックス化の時系列(以下s)を作成した後、時間によるものを再サンプリングされます。希望の出力に合わせるには、インデックスの開始時刻と終了時刻をsに調整します。

import io 
import pandas as pd 

data = io.StringIO('''\ 
Start,End,Duration,Subject 
0,07/04/16 10:30:00,07/04/16 11:00:00,30,Inspirational Poster Design Session 
1,07/04/16 15:00:00,07/04/16 15:30:00,30,Corporate Speak Do's and Don'ts 
2,07/04/16 09:00:00,07/04/16 12:00:00,180,Metrics or Matrix -Panel Discussion 
3,07/04/16 13:30:00,07/04/16 15:00:00,90,"Do More with Less" kickoff party 
4,07/05/16 09:00:00,07/05/16 10:00:00,60,Fiscal or Physical -Panel Discussion 
5,07/05/16 14:00:00,07/05/16 14:30:00,30,"Why we can't have nice thing" training video 
6,07/06/16 15:00:00,07/06/16 16:00:00,60,One-on-One with manager -Panel Discussion 
7,07/06/16 09:00:00,07/06/16 10:00:00,60,Fireing for Performance leadership session 
8,07/06/16 13:00:00,07/06/16 14:00:00,60,Birthday Cake in the conference room *MANDATORY* 
9,07/06/16 12:30:00,07/06/16 13:30:00,60,Obligatory lunchtime meeting because it was the only time everyone 
''') 
df = pd.read_csv(data, usecols=['Start', 'End', 'Subject']) 
df['Start'] = pd.to_datetime(df['Start']) 
df['End'] = pd.to_datetime(df['End']) 

# Ranges in datetime indices include the right endpoint 
tdel = pd.Timedelta('1min') 

s = pd.Series(False, index=pd.date_range(start=df['Start'].min(), 
             end=df['End'].max()-tdel, 
             freq='min')) 
for _, meeting in df.iterrows(): 
    s[meeting['Start'] : meeting['End']-tdel] = True 

result = s.resample('1H').sum().astype(int) 
print(result) 

出力:

2016-07-04 09:00:00 60 
2016-07-04 10:00:00 60 
2016-07-04 11:00:00 60 
2016-07-04 12:00:00  0 
2016-07-04 13:00:00 30 
2016-07-04 14:00:00 60 
2016-07-04 15:00:00 30 
2016-07-04 16:00:00  0 
2016-07-04 17:00:00  0 
2016-07-04 18:00:00  0 
2016-07-04 19:00:00  0 
2016-07-04 20:00:00  0 
2016-07-04 21:00:00  0 
2016-07-04 22:00:00  0 
2016-07-04 23:00:00  0 
2016-07-05 00:00:00  0 
2016-07-05 01:00:00  0 
2016-07-05 02:00:00  0 
2016-07-05 03:00:00  0 
2016-07-05 04:00:00  0 
2016-07-05 05:00:00  0 
2016-07-05 06:00:00  0 
2016-07-05 07:00:00  0 
2016-07-05 08:00:00  0 
2016-07-05 09:00:00 60 
2016-07-05 10:00:00  0 
2016-07-05 11:00:00  0 
2016-07-05 12:00:00  0 
2016-07-05 13:00:00  0 
2016-07-05 14:00:00 30 
2016-07-05 15:00:00  0 
2016-07-05 16:00:00  0 
2016-07-05 17:00:00  0 
2016-07-05 18:00:00  0 
2016-07-05 19:00:00  0 
2016-07-05 20:00:00  0 
2016-07-05 21:00:00  0 
2016-07-05 22:00:00  0 
2016-07-05 23:00:00  0 
2016-07-06 00:00:00  0 
2016-07-06 01:00:00  0 
2016-07-06 02:00:00  0 
2016-07-06 03:00:00  0 
2016-07-06 04:00:00  0 
2016-07-06 05:00:00  0 
2016-07-06 06:00:00  0 
2016-07-06 07:00:00  0 
2016-07-06 08:00:00  0 
2016-07-06 09:00:00 60 
2016-07-06 10:00:00  0 
2016-07-06 11:00:00  0 
2016-07-06 12:00:00 30 
2016-07-06 13:00:00 60 
2016-07-06 14:00:00  0 
2016-07-06 15:00:00 60 
Freq: H, dtype: int64 
+0

ほぼあります。私はこれを実行すると(1つだけの数値)、毎時の内訳ではなく、合計を取得しています。また、result = s.resample( '1H')。sum()。astype(int))の最後に、ぶら下がっているように見えるものが見つかりました。余分な括弧か声明が落とされましたか? – James

+0

はい、それはぶら下がり括弧でした。今すぐ修正しました。単一の番号を取得することについては、それは私には意味をなさない...多分あなたはパンダの古いバージョン(私は最新の:0.18.1を実行している)とそれにいくつかのバグがありますか? –