0
votes

Erreur dans Python: nom 'df' n'est pas défini

im NOUVEAU en Python, de nombreuses heures de googled et de recherche ici dans Stackoverflow. Mais j'ai toujours un problème avec mon code. J'ai besoin de courir foo em> fonction dans l'intervalle de temps et remplissez DataFrame (par exemple, chaque seconde ajoutez horodatage à DF). Je rencontre toujours un message d'erreur: NameError: strong> nom 'df' n'est pas défini em>

merci pour votre réponse. P>

code : P>

runfile('C:/Users/Miro/.spyder-py3/untitled8.py', wdir='C:/Users/Miro/.spyder-py3')
Exception in thread Thread-8:
Traceback (most recent call last):
  File "C:\Users\Miro\Anaconda3\envs\spyder_4_0_1\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\Miro\.spyder-py3\untitled8.py", line 90, in run
    self.execute(*self.args, **self.kwargs)
  File "C:\Users\Miro\.spyder-py3\untitled8.py", line 68, in foo
    df = df.append(df2)
NameError: name 'df' is not defined
2020-06-16 08_29_31.920157
Program killed: running cleanup code


4 commentaires

Vous n'avez pas défini le fichier dataframe df . Peut-être que cette ligne doit être indentée extérieure df = pd.dataframe ([])


Veuillez afficher la trace de trace afin que nous puissions facilement repérer où l'erreur se produit. Et envisagez de couper l'exemple. Moins de code à patte à travers est égal à des examinateurs heureux.


@TDelaney question est mise à jour


df = pd.dataframe ([]) est indenté de sorte que sa partie de la définition de la classe. Ce n'est pas une variable de niveau de module. Mais il existe également un en haut de la définition de la classe, suggérant que vous vouliez vraiment que la variable soit un niveau de module. Dans ce cas, le détenteur de cette ligne.


4 Réponses :


1
votes

Définir global df avant programme de classe (exception):


2 commentaires

Merci beaucoup, j'ajouterai "Global DF" et "df = pd.dataframe ([[])" avant "programme de classe (exception):" et le script va commei.


En fait, vous n'avez pas besoin d'ajouter Global DF au-dessus de la définition de la classe. Il est utilisé uniquement dans les définitions de la fonction. Et le df pourrait être inférieur à la classe ainsi que ci-dessus. Le problème était la mauvaise indentation.



0
votes

Cela signifie que DF est une variable de classe et ne fonctionne pas.

class ProgramKilled(Exception):
    global df
    df = pd.DataFrame([])
    pass


0 commentaires

0
votes

Vous avez fabriqué df code> partie de l'espace de noms code> de programme code>. Juste le dédent et devient une variable de niveau de module. Fonctions qui souhaitent l'affecter ultérieurement utilisent Global DF CODE> - mais vous faites déjà cette pièce correctement dans votre code.

juste changer à p>

class ProgramKilled(Exception):
    pass

df = pd.DataFrame([])


1 commentaires

J'ai fait un changement comme vous l'avez écrit et que le script fonctionne. Merci



0
votes

Merci à tous pour vos réponses utiles et rapides. Cette solution fonctionne:

    WAIT_TIME_SECONDS = 1

global df
df = pd.DataFrame([])

class ProgramKilled(Exception):
    pass



############################################################
############################################################
def foo():

    global df
    time1 = str(datetime.now())
    time2 = time1.replace(":", "_")
    print(time2)

    df2 = pd.DataFrame(data= {
    'timestamp': [time2],
    'cas_zapas_1_text': ['cas']
    })

    df = df.append(df2)

############################################################
############################################################
def signal_handler(signum, frame):
    raise ProgramKilled

class Job(threading.Thread):
    def __init__(self, interval, execute, *args, **kwargs):
        threading.Thread.__init__(self)
        self.daemon = False
        self.stopped = threading.Event()
        self.interval = interval
        self.execute = execute
        self.args = args
        self.kwargs = kwargs

    def stop(self):
                self.stopped.set()
                self.join()
    def run(self):
            while not self.stopped.wait(self.interval.total_seconds()):
                self.execute(*self.args, **self.kwargs)

if __name__ == "__main__":
    signal.signal(signal.SIGTERM, signal_handler)
    signal.signal(signal.SIGINT, signal_handler)
    job = Job(interval=timedelta(seconds=WAIT_TIME_SECONDS), execute=foo)
    job.start()

    while True:
          try:
              time.sleep(1)
          except ProgramKilled:
              print("Program killed: running cleanup code")
              job.stop()
              break


1 commentaires

Pas besoin de ce Global DF . Le problème était simplement l'indentation.