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?
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
ah! Leider war das ein Schreibfehler, kein Tippfehler in dem Code, den ich getestet habe. Guter Fang. –
Wie werden 'start' und' end' erstellt? Ich habe versucht, was du versuchst und es scheint für mich zu funktionieren. –