2016-07-29 8 views
3

営業日の計算に関連するthis questionに続いて、両方ともNULL値を含む2つの営業日を計算したいとします。私は、マスクを使用して値を設定する方法が期待どおりに動作しないことを確認しました。マスクを使用してnumpy ndarrayの値を設定する

私はpython 2.7.11、pandas 0.18.1、numpy 1.11.0を使用しています。私の少し変更されたコードは:

import datetime 
import numpy as np 
import pandas as pd 

def business_date_diff(start, end): 
    mask = pd.notnull(start) & pd.notnull(end) 
    start = start[mask] 
    end = end[mask] 
    start = start.values.astype('datetime64[D]') 
    end = end.values.astype('datetime64[D]') 
    result = np.empty(len(mask), dtype=float) 
    result[mask] = np.busday_count(start, end) 
    result[~mask] = np.nan 
    return result 

残念ながら、これは予想される営業日の違いを返しません(代わりに私は非常に近い0山車の数を取得します)。 np.busday_count(start, end)をチェックすると、結果が正しいように見えます。

print start[0:5] 
print end[0:5] 
print np.busday_count(start, end)[0:5] 

# ['2016-07-04' '2016-07-04' '2016-07-04' '2016-07-04' '2016-07-04'] 
# ['2016-07-05' '2016-07-05' '2016-07-05' '2016-07-06' '2016-07-06'] 
# [1 1 1 2 2] 

しかし、私はresultsの値をチェックするときの結果は意味がありません。私は間違っ

... 
result = np.empty(len(mask), dtype=float) 
result[mask] = np.busday_count(start, end) 
result[~mask] = np.nan 
print result 

# [   nan    nan 1.43700866e-210 1.45159738e-210 
# 1.45159738e-210 1.45159738e-210 1.45159738e-210 1.46618609e-210 
# 1.45159738e-210 1.64491834e-210 1.45159738e-210 1.43700866e-210 
# 1.43700866e-210 1.43700866e-210 1.43700866e-210 1.45159738e-210 
# 1.43700866e-210 1.43700866e-210 1.43700866e-210 1.43700866e-210 

何をしているのですか?

+1

マスクに問題がありますか? 'mask = pd.notnull(start)&pd.notnull(start)' 'pd.notnull(start)'をなぜ2回使用するのかよくわからないので、バグかもしれません。 – benten

+0

ああ!残念ながら、これは、私がテストしていたコードでは、誤植ではありませんでした。しかし、良いキャッチ。 –

+0

'start'と' end'はどのように作られていますか?私はあなたがしようとしていることを試してみて、それは私のために働くようです。 –

答えて

1

あなたの問題は、ご使用のバージョンのnumpyでは、ブール値配列を配列のインデックスとして使用できないということです。 maskの代わりにnp.where(mask==True)を使用し、〜maskの代わりにnp.where(mask==False)を使用してください。これは必要に応じて機能します。

関連する問題