2016-07-29 5 views
3

Ich möchte zwischen zwei Tagen, die beide Nullwerte enthalten, die folgenden Tage berechnen: this question für die Berechnung von Arbeitstagen. Ich habe festgestellt, dass sich die Art und Weise, wie ich Werte mithilfe einer Maske festlege, nicht wie erwartet verhält.Einstellen von Werten für ein numpy ndarray mit Hilfe der Maske

Ich benutze Python 2.7.11, Pandas 0.18.1 und numpy 1.11.0. Mein leicht modifizierten Code:

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 

Leider ist dies nicht die erwarteten Arbeitstag Unterschiede zurückkehrt (statt bekomme ich eine Reihe von sehr nahe 0 Floats). Wenn ich np.busday_count(start, end) überprüfe, sehen die Ergebnisse korrekt aus.

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] 

Aber wenn ich die Werte für results überprüfen die Ergebnisse nicht sinnvoll:

... 
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 

Was mache ich falsch?

+1

Ist es ein Problem mit der Maske? 'mask = pd.notnull (start) & pd.notnull (start)' Nicht sicher, warum Sie 'pd.notnull (start)' zweimal verwenden, vielleicht einen Fehler. – benten

+0

ah! Leider war das ein Schreibfehler, kein Tippfehler in dem Code, den ich getestet habe. Guter Fang. –

+0

Wie werden 'start' und' end' erstellt? Ich habe versucht, was du versuchst und es scheint für mich zu funktionieren. –

Antwort

1

Ihr Problem ist, dass Sie mit Ihrer Version von numpy kein boolesches Array als Index für ein Array verwenden können. Verwenden Sie einfach np.where(mask==True) anstelle von Maske und np.where(mask==False) anstelle von ~ Maske, und es wird wie gewünscht arbeiten.

Verwandte Themen