Anfängerfrage und oder Fehler...

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mistertoi
User
Beiträge: 4
Registriert: Samstag 12. Februar 2022, 15:33

Hallo zusammen,

nach Tagen der Tüftelei komme ich einfach nicht weiter.

Ich vereinfache mal:
Ich habe einen pandas DataFrame.

Spalte A = Datum (%d.%m.)
Spalte B = Tag (Mo, Di, Mi, Do, Fr, Sa, So) als string

das Problem ist:
Spalte C = Datum_2 (%d.%m.)

hier soll [Datum aus Spalte A] + timedelta stehen.

Wenn in Spalte B "Fr" steht - dann plus 3 Tage, sonst plus 1 Tag.
Mit dem Programmcode setzt er aber immer ALLE Werte in der gesamten Spalte auf plus 3 oder in meinem Fall plus 1 - und NICHT zeilenbasiert.

Jemand ne Idee oder ne Ahnung wie ich den Fehler beheben kann?

Herzlichen Dank

Code: Alles auswählen

import locale
from datetime import datetime, timedelta
import pandas as pd


wiederholung = df['Wiederholung']
wiederholung = pd.to_datetime(datum, infer_datetime_format=True)

for tag in df['Tag']:
    if tag == "Fr":
        df['Wiederholung'] = wiederholung+timedelta(days=3)
    else:
        df['Wiederholung'] = wiederholung+timedelta(days=1)
        
df['Wiederholung'] = df['Wiederholung'].dt.strftime('%d.%m.')
        
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man bei Pandas Schleifen benutzt, dann macht man was falsch. Du musst aus der Tag-Spalte die Tagdifferenz ausrechnen.

Code: Alles auswählen

days = df["tag"] * 2+ 1
mistertoi
User
Beiträge: 4
Registriert: Samstag 12. Februar 2022, 15:33

Danke erstmal für den Hinweis. Mit pandas beschäftige ich mich seit ca. 2 Wochen - learning by doing - mit Python selbst seit Weihnachten.
Von daher: ich kann Dir (noch)nicht ganz folgen ;)

mein gewünschtes Ergebnis soll so aussehen
  • Spalte A Spalte B Spalte C
    03.11. Mi 04.11.
    04.11. Do 05.11.
    05.11. Fr 08.11.
derzeit steht in Spalte C (der 05.11. war ein Freitag) - aber immer 06.11.

wie kann ich mit der von Dir vorgeschlagenen Lösung Wochentage multiplizieren?

Viele Grüße und Danke!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Da fehlt was, war schon zu spät:

Code: Alles auswählen

days = (df["tag"] == "Fr") * 2 + 1
mistertoi
User
Beiträge: 4
Registriert: Samstag 12. Februar 2022, 15:33

Hey,
heute hatte ich ein bisschen Zeit und hab ein bisschen rumexperimentiert - klappt soweit, aber wenn ich im Funktionsaufruf die Variable 'days' einsetze (s. Code) bekomme ich folgende Fehlermeldung:

"df['Wiederholung'] = datum+timedelta(days=days)
TypeError: unsupported type for timedelta days component: Series"

gebe ich statt der Variablen "days" eine Zahl ein, funktioniert es..... aber auch ein "int()" davor löst das Problem leider nicht

Funktion:

Code: Alles auswählen

days = (df['Tag'] == "Fr") * 2+1
df['Wiederholung'] = datum+timedelta(days=days)
ich hatte zuvor eine Umwandlung zum String in der Funktion stehen (die mache ich jetzt nur in der Ausgabe "%d.%m" als verkürztes Datum - und leider hab ich immer noch nicht gerafft, wie ich beim Durchlauf durch das Feld auf die FOR-Schleife verzichten kann....
mistertoi
User
Beiträge: 4
Registriert: Samstag 12. Februar 2022, 15:33

Hi,
nach ein paar Tagen Pause hab ich nochmal mein Glück versucht - die von Sirius3 vorgeschlagene Funktion funktioniert. Vermutlich kommen jetzt aber meine unzureichenden pandas Kentnisse zum Tragen, wenn ich sie anwende - dann addiert pandas den jeweil letzten gültigen "days"-Wert auf ALLE Spaltenwerte dazu.
Es findet also keine zeilenweise Addition statt. Meine Versuche mit .loc / .map sind bislang ohne Erfolg - jemand noch nen nTipp?

Code: Alles auswählen

def wiederholen(tag):
    days = (tag == "Fr") * 2+1
    df['Wiederholung'] = pd.to_datetime(df['Wiederholung'])
    df['Wiederholung'] = df['Datum']+timedelta(days=days)

Antworten