Einsteiger benötigt Hilfe bei timedelta series to minute

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
JoMü89
User
Beiträge: 4
Registriert: Mittwoch 19. August 2020, 03:44

Hallo in die Runde :-)
ich bin blutiger Anfänger und versuche mich in die Datenanalyse mittels Python/Pandas einzuarbeiten und bin über jede Hilfe dankbar :-)
Mein Code soll dazu dienen die Differenz zwischen einem Startdatum Bsp.: 01.01.2019 05:47 und einem Enddatum Bsp.: 01.01.2019 06:00 in Minuten in einer Spalte eines DataFrames auszugeben. Mit dem unten angezeigten Code unter 1. kriege ich dies auch hin, jedoch in einem series timedelta format (wenn ich mich nicht irre :?: ).
1.
>>
df["Exe Time"] = pd.to_datetime(df["Exe Time"])
##print(df_ExeTime)
df["CtrctStartTime"] = pd.to_datetime(df["Ctrct"].str.slice(0, 14, 1))
##print(df_CtrctTime)
df["LeadTime"] = df["CtrctStartTime"] - df["Exe Time"]
>>
Mit der Erweiterung (fett markiert) in Code 2., habe ich nun versucht dieses series timedelta format in Minuten umzuwandeln.
Jedoch ohne Erfolg :?
2.
>>
df["Exe Time"] = pd.to_datetime(df["Exe Time"])
##print(df_ExeTime)
df["CtrctStartTime"] = pd.to_datetime(df["Ctrct"].str.slice(0, 14, 1))
##print(df_CtrctTime)
df["LeadTime"] = df["CtrctStartTime"] - df["Exe Time"]
df["LeadTime"] = divmod(df["LeadTime"].seconds, 60)
>>
Kann mir jemand von Euch netterweise helfen?

Vielen Dank Vorab!
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Das pandas-Timedelta Objekt hat eine Methode total_seconds(). Ich vermute, dass du die suchst.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@JoMü89: Meine Erfahrung mit Pandas hält sich in Grenzen, aber: Mir kommt es sehr seltsam vor, dass du in der sten Zeile direkt eine Spalte konvertierst. Ich bin mir ziemlich sicher, dass das bereits beim Einlesen passieren sollte.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Mir sind da noch ein paar kleine Ergänzungen aufgefallen:
- die prints werden auch ohne Kommentar nicht funktionieren
- verwende keine unnötigen Abkürzungen: Bspw. execution_time, contract_start (?)
- wie sparrow sagte, geschieht die Umformung etwas merkwürdig (auch unter Zuhilfenahme von str.slice) und spät. Vermutlich lässt sich das gleich beim Import korrigieren.
Wenn du uns einen Beispieldatensatz gibst und den Code, der davor läuft, können wir das bestimmt noch ein wenig verschönern :)
JoMü89
User
Beiträge: 4
Registriert: Mittwoch 19. August 2020, 03:44

Würde euch gerne den Code und ein Bild zur Verfügung stellen, allerdings Scheiter ich gerade noch an dem Editor :-/
Wenn ich Bild einfügen betätige dann kommt nur Bild...

Und wie kann ich euch denn den Code aus dem Jupiter Notebook heraus kopieren, sodass der nicht so beschissen wie bei meinem ersten Posting dargestellt wird.
Ist mir sehr unangenehm, dass ich bereits daran Scheiter....

Danke vorab :-)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Bilder musst du auf einem Image Hoster hochladen wie z.B. imgur, dann poste den Link hier.

Für Code darzustellen gibt es im vollständigen Editor den </> Button. Der Code muss dann zwischen die Codetags.
JoMü89
User
Beiträge: 4
Registriert: Mittwoch 19. August 2020, 03:44

Dank der Hinweise von euch, fange ich noch mal von Vorne an, da die Infos von mir ein wenig knapp waren.

Ich habe eine CSV-Datei die ich einlese mit einigen Spalten und aus dieser möchte ich nur ausgewählte Spalten und nur Stundenkontrakte aus der Spalte Ctrct übernehmen. Dies funktioniert auch so weit. Aus der Spalte Ctrct ziehe ich nun den Startzeitpunkt des Kontrakts um die Zeitdifferenz zwischen diesem und der Ausführungszeit (Exe Time) zu berechnen und dies in eine neue Spalte zu schreiben die LeadTime heißt. Auch das habe ich soweit hinbekommen. Jedoch ist das Format der Zeitdifferenz nicht Minuten sondern timedelta. Um nun eine Korrelation zwischen den Spalten Price und TimeLead zu bilden, benötige ich die Zeitdifferenz jedoch in Minuten...und hier Scheiter ich...

Anbei habe ich dies ein mal in einem Bild dargestellt: Bild

Mein Code sieht wie folgt aus:

Code: Alles auswählen

df = pd.read_csv("/Users/johannesmueller/Python/Import Export/2019-01-01-Own_Trade.csv", delimiter = ";", 
                 usecols = lambda column : column not in ["UsrCode" ,"UsrName","Area","TmZn","State","Accnt","P/O",
                 "Phase","TradeID","OrdrID","Text","StlmntState","StlmntInfo"],
                 skip_blank_lines = True, encoding = "iso-8859-1")

Code: Alles auswählen

df = df[~df.Ctrct.str.contains('15')]
df = df[~df.Ctrct.str.contains('30')]
df = df[~df.Ctrct.str.contains('45')]
df = df.sort_values(by = ['B/S','Ctrct'])

Code: Alles auswählen

df["Exe Time"] = pd.to_datetime(df["Exe Time"])
print(df_ExeTime)
df["CtrctStartTime"] = pd.to_datetime(df["Ctrct"].str.slice(0, 14, 1))
print(df_CtrctTime)
df["LeadTime"] = df["CtrctStartTime"] - df["Exe Time"]
df["Costs_Revenues"] = df["Prc"] * df['Qty']
df.to_csv("/Users/johannesmueller/Python/Import Export/test.csv", sep=';')
Hoffe dass ihr nachvollziehen könnt, wo mein Problem liegt... :) :)
JoMü89
User
Beiträge: 4
Registriert: Mittwoch 19. August 2020, 03:44

Habe die Lösung für das Problem herausgefunden und den Code wie folgt angepasst:

Code: Alles auswählen

df1["Exe Time"] = pd.to_datetime(df1["Exe Time"])
# need to improve
df1["CtrctStartTime"] = pd.to_datetime(df1["Ctrct"].str.slice(0, 14, 1))
df1["LeadTime"] = (df1["CtrctStartTime"] - df1["Exe Time"]).astype("timedelta64[m]")
Antworten