Umändern von Datumswerten
Verfasst: Sonntag 4. Juni 2023, 22:56
Hey, also ich versuche gerade folgendes zu rechnen:
Daten pro Tag sind in einem df gespeichert. Zusätzlich stehen in einem anderen df_result Werte für den jeweiligen Monat. Nun soll pro Tag der wert von df geändert werden. Hierbei soll folgendes passieren: Die Daten in dem df sind schon in Monaten gruppiert. Das Ergebnis aus df_result soll nun für den jeweiligen Monat ausgelesen werden. Wenn das Ergebnis >1, sollen die Tageswerte auf 0 gesetzt werden und von dem Wert soll 1 subtrahiert werden. Das Ergebnis soll an die Berechnung des 2. Tages weitergegeben werden. Wenn das Ergebnis jedoch <1, aber >0, soll das jeweilige Ergebnis prozentual von dem bestehenden Wert in df abgezogen werden. Für die restlichen Tage im Monat enden hier dann jegliche Änderungen. Für den dritten Tag wird dann das umgeänderte Ergebnis aufgenommen. Und es passiert wieder dasselbe. Wenn das Ergebnis >1, sollen die Tageswerte auf 0 gesetzt werden und von dem Wert soll 1 subtrahiert werden. Das Ergebnis soll an die Berechnung des 3. Tages weitergegeben werden. Wenn das Ergebnis jedoch <1, aber >0, soll das jeweilige Ergebnis prozentual von dem bestehenden Wert in df abgezogen werden. Für die restlichen Tage im Monat enden hier dann jegliche Änderungen. Das geht so weiter bis das Ergebnis 0 ist.
Als Beispiel werden die Werte des df bei einem Ergebnis von 4.3 dann so verändert: Die ersten 4 Tage werden auf 0 gesetzt und von dem wert des 5ten Tages werden 30% abgezogen. Der Rest der Tage des Monates behält seine ursprünglichen Werte. Das ist was ich bis jetzt habe:
monate = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
werte = ['8.64', '7.64', '1.56', '3.1', '5.39', '8.33', '9.21', '3.1', '2.768', '0.37', '1.74', '9.93']
# Erstellen des Dataframes
df_result = pd.DataFrame({'Monat': monate, 'Wert': werte})
df_result['Wert'] = df_result['Wert'].astype(float)
#df = df.astype(float)
df_result['Ergebnis'] = df_result['Monat'].map(df_max.set_index('Monat')['Tag'] / 100) * df_result['Wert']
df = pd.read_excel(Xoko.xlsx)
# Datumsformat in 'date' in DateTime umwandeln
df['date'] = pd.to_datetime(df['date'], format='%d-%b')
#def group_by_month(date):
#return date.strftime('%b')
for month, group in df.groupby(df['date'].dt.month):
if not df_result[df_result['Monat'] == month].empty:
ergebnis = df_result.loc[df_result['Monat'] == month, 'Ergebnis'].values[0]
tageswerte = group['Tageswerte'].iloc[0]
month_abbr = monate[month - 1]
#if month_abbr in df_result['Monat'].values:
ergebnis = df_result.loc[df_result['Monat'] == monate[month-1], 'Ergebnis'].values[0]
for i in range(0, len(group)):
if ergebnis > 1:
tageswerte = 0
ergebnis -= 1
elif ergebnis > 0:
tageswerte = tageswerte - (tageswerte * ergebnis)
ergebnis = 0
else:
break
if i + 1 < len(group):
month_abbr = monate[month - 1]
ergebnis = df_result.loc[df_result['Monat'] == month_abbr, 'Ergebnis'].values[0]
if ergebnis == 0:
break
group.loc[group.index, 'Tageswerte'] = tageswerte
df.loc[group.index, 'Tageswerte'] = group['Tageswerte']
Das Problem hierbei ist, dass mittlerweile einfach alle Werte auf 0 gesetzt werden. Findet jemand den Fehler und kann mir helfen? Ich habe schon mehrere Sachen ausprobiert, aber irgendwie will das nicht.
Das würde mich sehr freuen.
Mit freundlichen Grüßen
wikingerjonathan
Daten pro Tag sind in einem df gespeichert. Zusätzlich stehen in einem anderen df_result Werte für den jeweiligen Monat. Nun soll pro Tag der wert von df geändert werden. Hierbei soll folgendes passieren: Die Daten in dem df sind schon in Monaten gruppiert. Das Ergebnis aus df_result soll nun für den jeweiligen Monat ausgelesen werden. Wenn das Ergebnis >1, sollen die Tageswerte auf 0 gesetzt werden und von dem Wert soll 1 subtrahiert werden. Das Ergebnis soll an die Berechnung des 2. Tages weitergegeben werden. Wenn das Ergebnis jedoch <1, aber >0, soll das jeweilige Ergebnis prozentual von dem bestehenden Wert in df abgezogen werden. Für die restlichen Tage im Monat enden hier dann jegliche Änderungen. Für den dritten Tag wird dann das umgeänderte Ergebnis aufgenommen. Und es passiert wieder dasselbe. Wenn das Ergebnis >1, sollen die Tageswerte auf 0 gesetzt werden und von dem Wert soll 1 subtrahiert werden. Das Ergebnis soll an die Berechnung des 3. Tages weitergegeben werden. Wenn das Ergebnis jedoch <1, aber >0, soll das jeweilige Ergebnis prozentual von dem bestehenden Wert in df abgezogen werden. Für die restlichen Tage im Monat enden hier dann jegliche Änderungen. Das geht so weiter bis das Ergebnis 0 ist.
Als Beispiel werden die Werte des df bei einem Ergebnis von 4.3 dann so verändert: Die ersten 4 Tage werden auf 0 gesetzt und von dem wert des 5ten Tages werden 30% abgezogen. Der Rest der Tage des Monates behält seine ursprünglichen Werte. Das ist was ich bis jetzt habe:
monate = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
werte = ['8.64', '7.64', '1.56', '3.1', '5.39', '8.33', '9.21', '3.1', '2.768', '0.37', '1.74', '9.93']
# Erstellen des Dataframes
df_result = pd.DataFrame({'Monat': monate, 'Wert': werte})
df_result['Wert'] = df_result['Wert'].astype(float)
#df = df.astype(float)
df_result['Ergebnis'] = df_result['Monat'].map(df_max.set_index('Monat')['Tag'] / 100) * df_result['Wert']
df = pd.read_excel(Xoko.xlsx)
# Datumsformat in 'date' in DateTime umwandeln
df['date'] = pd.to_datetime(df['date'], format='%d-%b')
#def group_by_month(date):
#return date.strftime('%b')
for month, group in df.groupby(df['date'].dt.month):
if not df_result[df_result['Monat'] == month].empty:
ergebnis = df_result.loc[df_result['Monat'] == month, 'Ergebnis'].values[0]
tageswerte = group['Tageswerte'].iloc[0]
month_abbr = monate[month - 1]
#if month_abbr in df_result['Monat'].values:
ergebnis = df_result.loc[df_result['Monat'] == monate[month-1], 'Ergebnis'].values[0]
for i in range(0, len(group)):
if ergebnis > 1:
tageswerte = 0
ergebnis -= 1
elif ergebnis > 0:
tageswerte = tageswerte - (tageswerte * ergebnis)
ergebnis = 0
else:
break
if i + 1 < len(group):
month_abbr = monate[month - 1]
ergebnis = df_result.loc[df_result['Monat'] == month_abbr, 'Ergebnis'].values[0]
if ergebnis == 0:
break
group.loc[group.index, 'Tageswerte'] = tageswerte
df.loc[group.index, 'Tageswerte'] = group['Tageswerte']
Das Problem hierbei ist, dass mittlerweile einfach alle Werte auf 0 gesetzt werden. Findet jemand den Fehler und kann mir helfen? Ich habe schon mehrere Sachen ausprobiert, aber irgendwie will das nicht.
Das würde mich sehr freuen.
Mit freundlichen Grüßen
wikingerjonathan