2017-10-24 1 views
1

私のパンダデータフレームに2列あり、それらの間の営業日を計算したい。パンダデータフレーム(NaTを含む)の2つの列の間の営業日を見つける

データ:

ID  On hold  Off Hold 
101 09/15/2017 09/16/2017 
102 NA   NA 
103 09/22/2017 09/26/2017 
104 10/12/2017 10/30/2017 
105 NA   NA 
106 08/05/2017 08/06/2017 
107 08/08/2017 08/03/2017 
108 NA   NA 

私はnumpyのからbusday_countを使用して以下のコードを試みた:

df1['On hold'] = pd.to_datetime(df1['On hold']) 
df1['Off Hold'] = pd.to_datetime(df1['Off Hold']) 
np.busday_count(df1['On hold'].values.astype('datetime64[D]'),df1['Off Hold'].values.astype('datetime64[D]')) 

はまた、

np.where(pd.notnull(df1['On hold']),np.busday_count(df1['On hold'].values.astype('datetime64[D]'), 
               df1['Off Hold'].values.astype('datetime64[D]')),0) 

エラーがあった:

Cannot compute a business day count with a NaT (not-a-time) date 

何か助けていただければ幸いです。

+0

NATの値で日扱いするつもりはどうすればよいですか?無視されるか帰属されるか? – ShreyasG

+0

無視され、NaTでない場合にのみ計算したい –

+0

[This(https://stackoverflow.com/questions/37840812/pandas-subtracting-two-date-columns-and-the-result-being-an-整数)の回答がある可能性があります – ShreyasG

答えて

1

をあなたは以下を試すことができます。

f = df1.dropna() 
f['days'] = np.busday_count(pd.to_datetime(f['On hold']).values.astype('datetime64[D]'), \ 
      pd.to_datetime(f['Off hold']).values.astype('datetime64[D]')) 

df1.merge(f[['ID', 'days']],on='ID', how='left') 
0

バスの日数をカウントする前にまずNAを落とすようにしてください。以下を使ってすべてのNAを削除することができます。 pd.bdate_range方法使用

new_df = df.dropna() 
+0

これは単なるデータのスニペットです.nをドロップすると、データフレームの他の列に影響します。 –

0

pd.bdate_range(df['On Hold'], df['Off Hold'], freq = 'B') 
+0

これを実行したときの出力を共有できますか? –

関連する問題