2016-07-29 9 views
-3

Ich versuche eine Funktion so einzurichten, dass sie nur ausgeführt wird, wenn zwei Bedingungen erfüllt sind: wenn die Variable größer als ein Wert und kleiner als ein anderer Wert ist.Wie setze ich 2 Bedingungen in eine "if" -Anweisung?

Ich habe zwei Funktionen über diese, die start_time und end_time definieren, sowie eine Schleife, die die Dateien verarbeitet. Wie Sie anhand meiner if-Anweisung sehen können, versuche ich, die Daten einer Datei innerhalb einer Reihe von Zahlen zu lesen. Als ich es eingestellt, wie ich es tat, jedoch bekomme ich diesen Fehler:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Ich verstehe nicht, wie diese zu lösen, vor allem, weil ich zwei Variablen verwende (start_date, end_date: sowohl einen numerischen Wert angegeben auf der vorherigen Funktion).

Kurz gesagt, wie kann ich meine gewünschte "if" -Anweisung machen?

bearbeiten: Außerdem möchte ich die Dateien, die, werden ignoriert nicht die Kriterien erfüllen, und ich bin nicht sicher, ob sie sein wird, wenn ich eine „else“ Anweisung nicht schreiben.

+2

Warum machst du nicht, was die Fehlermeldung sagt? – Marcin

+1

Ihr Code ist wirklich schwer zu lesen. Sind Sie allergisch auf Leerzeichen? Aussagekräftige Variablennamen? Erläuternde Kommentare? –

+0

weil es anscheinend keine Erklärungen gibt, wie man es benutzt, die zu meinem Fall passen. Danke für die Hilfe, obwohl, ich schätze es wirklich @Marcin – xyzman

Antwort

1

Der Fehler ist von der Tatsache, dass Sie ein Array (a.k.a. juld) mit einer Nummer vergleichen. Kurz gesagt, müssen Sie entweder ein bestimmtes Element für die if-Anweisung angeben oder die Methoden any() oder all() verwenden, die in der Fehlermeldung aufgeführt sind. Sie finden die Definition dieser Methoden here.

0

Ich verstehe nicht wirklich, was Sie hier tun möchten, aber es gibt drei Möglichkeiten. Wenn Sie nur in den Block gehen möchten, wenn alle Werte im Array diesen erfüllen, verwenden Sie a.all (condition). Wenn Sie die Bedingung erfüllen möchten, verwenden Sie a.any (condition). Wenn Sie für jeden Wert des Feldes auf den Block gehen möchten, die den Wert erfüllt, würden Sie

for x in array: 
    if(condition): 
     do stuff 
    else: 
     do other stuff 
0

Das Problem liegt daran, dass Sie ein Array dh juld zu zwei Daten/Zahlen vergleichen, start_date und end_date . Sie müssen also in der Lage sein, das Array in ein Datum/eine Zahl zu ändern. Ich kann nicht sehen, das, was in juld ist, aber ich vermute, wenn Sie nur Ihren Code ändern:

if start_date<juld[0]<end_date: 

dann wird es also die folgenden Werke arbeiten (liefert 1):

import datetime 
d1 = datetime.date(1996, 4, 1) 
d2 = datetime.date(2017, 7, 29) 
dt = datetime.date(2016, 7, 29) 
x = Read_Data(dt, d1 , d2) 

wo:

def Read_Data(date, start_date, end_date): 
    if start_date<date<end_date: 
     return 1 
+0

Wenn Sie also juld [0] schreiben, setzen Sie den Schwellenwert auf 0? Meine Werte liegen bei 20.000, da ich Julian Dates verwende. Könnten Sie das ein wenig genauer erläutern? Danke – xyzman

+0

Lassen Sie mich dieses 'np.array (ncfile.variables [' JULD '] [:]) 'überprüfen und zurückstellen. – cpemberton

+0

Haben Sie nur ein Datum erwarten aus dieser Aufforderung kommen ?: 'np.array (ncfile.variables [ 'JULD'] [:])' Wenn ja dann wie drucken 'print (juld)' Wenn Das Datum, nach dem Sie suchen, ist das 0. Element in diesem Array, dann ist die obige Lösung korrekt. Wenn Sie jedoch mehr als ein Datum erwarten und Operationen an diesen Daten ausführen möchten, würde ich vorschlagen, dass Sie das Array wie für jedes d in jdd durchlaufen. Ich hoffe, das hilft! Tut mir leid, Sie haben eine harte Zeit damit! – cpemberton

1

Zunächst einmal denke ich, dass man sich die Min-/max-Wert von juld wollen würde, wie es ein Array ist. Versuchen Sie etwas wie:

if max(juld) < start_date or min(juld) > end_date: 

Ich denke, das sollte funktionieren!

+0

Danke, endlich eine vernünftige Antwort ohne Leute geben mir downvotes lol – xyzman

Verwandte Themen