2017-02-28 8 views
1

ログを読み込み、特定のワークフローの期間を計算しようとしています。パンダの行間のデータフレーム計算

、私は次のコードを使用してやっている期間を計算するために
Timestamp Workflow Status 
20:31:52  ABC   Started 
... 
... 
20:32:50  ABC   Completed 

start_time = log_text[(log_text['Workflow']=='ABC') & (log_text['Category']=='Started')]['Timestamp'] 
compl_time = log_text[(log_text['Workflow']=='ABC') & (log_text['Category']=='Completed')]['Timestamp'] 
duration = compl_time - start_time 

と私が得る答えは次のとおりです。

ので、ログを含むデータフレームは次のようになります
1 NaT 
72 NaT 
Name: Timestamp, dtype: timedelta64[ns] 

インデックスが違うので、時差が正しく計算されていないと思います。もちろん、私はによって明示的に各列のインデックスを使用して正しい答えを得ることができます:

duration = compl_time.loc[72] - start_time[1]

しかし、これは物事の無粋な方法のようです。同じことを達成するためのより良い方法はありますか?

答えて

0

あなたは正しく、異なるindexesの問題があるため、出力を整列させることができず、NaNを取得します。

mask = log_text['Workflow']=='ABC' 
start_time = log_text.loc[mask & (log_text['Status']=='Started'), 'Timestamp'] 
compl_time = log_text.loc[mask & (log_text['Status']=='Completed'),'Timestamp'] 

print (len(start_time)) 
1 
print (len(compl_time)) 
1 

duration = compl_time - start_time.values 

print (duration) 
1 00:00:58 
Name: Timestamp, dtype: timedelta64[ns] 

duration = compl_time.values - start_time.values 

print (pd.to_timedelta(duration)) 
TimedeltaIndex(['00:00:58'], dtype='timedelta64[ns]', freq=None) 

print (pd.Series(pd.to_timedelta(duration))) 
0 00:00:58 
dtype: timedelta64[ns] 

最も単純には、boolean indexingを選択するためのより良い使用locあるvaluesによってnumpy arrayへの出力を変換しますが、(ここでは両方ともlength == 1ある)の両方Seriesのと同じな長さが必要です

関連する問題