使用蒙版设置numpy ndarray的值

时间:2016-07-29 16:29:38

标签: python numpy pandas

我想计算两次之间的工作日,两次都包含与计算工作日相关的this question之后的空值。我已经确定我使用掩码设置值的方式不符合预期。

我正在使用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 个答案:

答案 0 :(得分:1)

您的问题是,对于您的numpy版本,您不能使用布尔数组作为数组的索引。只需使用np.where(mask==True)代替掩码和np.where(mask==False)而不是〜掩码,它将按照需要使用。