ich habe ein DataFrame (dfData_NTMR018) mit Prozessdaten, welches ich gerne bearbeiten möchte. Eine Spalte enthält den Zeitstempel. Im ersten Schritt habe ich der Uhrzeit die passende Schicht zugewiesen. Frühschicht von 6 Uhr bis 14 Uhr, Spätschicht von 14 bis 22 Uhr und Nachtschicht von 22 Uhr bis 6 Uhr. Die Nachtschicht geht vom Datum her über zwei Tage. Als Beispiel:
Die Nachtschicht vom 28.02.2024 geht von 22 Uhr am 28.02.2024 bis 6 Uhr am 29.02.2024.
In einer neuen Spalte möchte ich jetzt das Schichtdatum haben. Das bedeutet, wenn in der Zeile beim Zeitstempel 2024-02-29 03:25:23 steht, soll beim Schichtdatum 2024-02-28 stehen, da es sich ja um die Nachtschicht vom 28.02.2024 handelt. Bisher habe ich das folgendermaßen gelöst:
Code: Alles auswählen
times = dfData_NTMR018['Frenco_Zeitstempel'].dt.time
dfData_NTMR018['Schicht'] = ""
dfData_NTMR018['Schicht'][(times >= datetime.time(6, 0)) & (times < datetime.time(14, 0))] = 'FS'
dfData_NTMR018['Schicht'][(times >= datetime.time(14, 0)) & (times < datetime.time(22, 0))] = 'SS'
dfData_NTMR018['Schicht'][(times >= datetime.time(22, 0)) | (times < datetime.time(6, 0))] = 'NS'
dfData_NTMR018['Schicht_Datum'] = dfData_NTMR018['Frenco_Zeitstempel'].dt.date
dfData_NTMR018['Schicht_Datum'][times < datetime.time(6, 0)] -= datetime.timedelta(days=1)
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series,
because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:
df["col"][row_indexer] = value
Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/s ... sus-a-copy
dfData_NTMR018['Schicht_Datum'][times < datetime.time(6, 0)] -= datetime.timedelta(days=1)
Deswegen ermittle ich jetzt die Früh-, Spät und Nachtschicht mit einer Funktion und apply. Für das Schichtdatum wollte ich dasselbe machen mit der Funktion Nachtschicht_Zuweisung. Genau hier hänge ich jetzt auch. Ich weiß nicht genau, wie ich den Zeitstempel (Datum_Zeit) in Form '%d.%m.%Y %H:%M:%S' in der Funktion Nachtschicht_Zuweisung einmal als Uhrzeit und einmal in ein Datum konvertiere.
Kann mir hier jemand behilflich sein?
Code: Alles auswählen
import datetime
.
.
.
.
def Schichtzuweisung(Zeit):
if Zeit >= datetime.time(6, 0) and Zeit < datetime.time(14, 0):
return 'FS'
elif Zeit >= datetime.time(14, 0) and Zeit < datetime.time(22, 0):
return 'SS'
else:
return 'NS'
def Nachtschicht_Zuweisung(Datum_Zeit):
if Datum_Zeit(als Uhrzeit) < datetime.time(6, 0):
return Datum_Zeit(als Datum) - datetime.timedelta(days=1)
times = dfData_NTMR018['Frenco_Zeitstempel'].dt.time
dfData_NTMR018['Schicht'] = times.apply(Schichtzuweisung)
dfData_NTMR018['Schicht_Datum'] = dfData_NTMR018['Frenco_Zeitstempel'].apply(Nachtschicht_Zuweisung)