Hallo liebe leute,
ich hab vor kürzem mit python angefangen und versuche mir jetzt ein skript zu machen wo ich die Bearbeitungszeiten zwischen verschidenen Statusen berechnen kann aus einem csv file. Bin mir aber jetzt nicht sicher ob ich den file mit pandas oder csv ins skript laden soll. Soll ich das dann weiter mit pandas bearbeiten oder die spalten einfach in ein neues Dictionary laden und es dann von da aus bearbeiten.
Time Status
0 Aug 27, 2022 09:26:28 am Offline
1 Aug 27, 2022 09:30:04 am Available
2 Aug 27, 2022 09:30:04 am Joining Customer
3 Aug 27, 2022 09:30:04 am Connecting Agent
4 Aug 27, 2022 09:30:05 am Connected
5 Aug 27, 2022 09:30:06 am Busy
6 Aug 27, 2022 09:39:35 am Wrap Up
7 Aug 27, 2022 09:39:40 am ACW Manual
8 Aug 27, 2022 10:08:01 am Available
9 Aug 27, 2022 10:08:01 am Joining Customer
10 Aug 27, 2022 10:08:01 am Connecting Agent
11 Aug 27, 2022 10:08:08 am Connected
12 Aug 27, 2022 10:08:09 am Busy
13 Aug 27, 2022 10:14:31 am Wrap Up
14 Aug 27, 2022 10:14:36 am ACW Manual
15 Aug 27, 2022 10:31:59 am Available
16 Aug 27, 2022 10:39:13 am Joining Customer
17 Aug 27, 2022 10:39:13 am Connecting Agent
18 Aug 27, 2022 10:39:23 am Connected
19 Aug 27, 2022 10:39:24 am Busy
.................
Das wäre der output wenn ich den file mit pandas lade und ausdrücke.
Mein eigentliches problem ist das ich nicht weiss wie ich die Zeilen wo zB Status auf Available ist auswählen kann und wie ich es mache das ich nur die Zeit zwischen Available berechnen kann und ob ich das mit pandas erreiche oder mit csv / dict. Könnte man das auch mit Matrix machen?
Hätte jemand paar tips für mich damit ich weiss in welcher richtung ich gehen kann?
Dankee !!
Bearbeitungszeit nach Status berechnen
Danke Sirius3 für deine Antwort!
So weit bin ich gekommen:
import csv
import numpy as np
import pandas as pd
pd.options.display.max_rows = 9999
df=pd.read_csv(r'file.csv')
del df['Event Data']
new_df = df.dropna()
new_df.to_string()
new_df['Time'] = pd.to_datetime(df['Time'])
file = open("myfile.txt", "w")
for x in new_df.index:
if new_df.loc[x, 'Status'] == 'Offline':
print ("Offline", new_df.loc[x, 'Time'] )
continue
if new_df.loc[x, 'Status'] == 'Break Short':
print ("Break Short", new_df.loc[x, 'Time'] )
continue
if new_df.loc[x, 'Status'] == 'Break Long (Lunch/Dinner)':
print ("Break Long(Lunch/Dinner)", new_df.loc[x, 'Time'] )
continue
if new_df.loc[x, 'Status'] == 'Available':
print ("Available", new_df.loc[x, 'Time'])
continue
if new_df.loc[x, 'Status'] == 'ACW Manual':
print ("ACW Manual", new_df.loc[x, 'Time'])
continue
else:
print ("Other")
file.close()
-------------------------------------------------------------------------------------------------------------------------------
output:
('Offline', Timestamp('2022-08-27 09:26:28'))
('Available', Timestamp('2022-08-27 09:30:04'))
Other
Other
('ACW Manual', Timestamp('2022-08-27 10:54:54'))
('Available', Timestamp('2022-08-27 10:56:20'))
Other
Other
('ACW Manual', Timestamp('2022-08-27 10:59:50'))
('Break Short', Timestamp('2022-08-27 11:08:30'))
('Available', Timestamp('2022-08-27 11:23:23'))
Other
.
.
.
Kommt in diesem Format raus.
Wie kann ich es jetzt am besten machen das ich Zugriff auf den Zeitstempel bekomme so dass ich diesen abhängig von den Status subtrahieren kann und die Durchsnittszeit angezeigt bekomme? Gibt es dafür auch fertige pandas Funktionen oder muss ich anders vorgehen?
Danke
So weit bin ich gekommen:
import csv
import numpy as np
import pandas as pd
pd.options.display.max_rows = 9999
df=pd.read_csv(r'file.csv')
del df['Event Data']
new_df = df.dropna()
new_df.to_string()
new_df['Time'] = pd.to_datetime(df['Time'])
file = open("myfile.txt", "w")
for x in new_df.index:
if new_df.loc[x, 'Status'] == 'Offline':
print ("Offline", new_df.loc[x, 'Time'] )
continue
if new_df.loc[x, 'Status'] == 'Break Short':
print ("Break Short", new_df.loc[x, 'Time'] )
continue
if new_df.loc[x, 'Status'] == 'Break Long (Lunch/Dinner)':
print ("Break Long(Lunch/Dinner)", new_df.loc[x, 'Time'] )
continue
if new_df.loc[x, 'Status'] == 'Available':
print ("Available", new_df.loc[x, 'Time'])
continue
if new_df.loc[x, 'Status'] == 'ACW Manual':
print ("ACW Manual", new_df.loc[x, 'Time'])
continue
else:
print ("Other")
file.close()
-------------------------------------------------------------------------------------------------------------------------------
output:
('Offline', Timestamp('2022-08-27 09:26:28'))
('Available', Timestamp('2022-08-27 09:30:04'))
Other
Other
('ACW Manual', Timestamp('2022-08-27 10:54:54'))
('Available', Timestamp('2022-08-27 10:56:20'))
Other
Other
('ACW Manual', Timestamp('2022-08-27 10:59:50'))
('Break Short', Timestamp('2022-08-27 11:08:30'))
('Available', Timestamp('2022-08-27 11:23:23'))
Other
.
.
.
Kommt in diesem Format raus.
Wie kann ich es jetzt am besten machen das ich Zugriff auf den Zeitstempel bekomme so dass ich diesen abhängig von den Status subtrahieren kann und die Durchsnittszeit angezeigt bekomme? Gibt es dafür auch fertige pandas Funktionen oder muss ich anders vorgehen?
Danke

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 8. csv und numpy werden importiert aber nicht benutzt.
Der to_string-Aufruf ist nutzlos, weil Du mit dem Ergebnis gar nichts machst. Die umwandlung nach datetime sollte schon beim Lesen gemacht werden. Wenn man nicht alle Spalten raucht, dann gibt man die an, die man raucht.
Dateien öffnet man immer innerhalb eines with-Statements, mit file machst Du aber gar nichts.
Wenn man über einen Index iteriert macht man etwas falsch! Besonders mit pandas. Will man wirklich mit jedem Datensatz etwas machen, dann gibt es itertuples.
continue sollte man nicht benutzen. Hier wäre der offensichtliche Ersatz elif, aber da sowieso in jedem if-Block das selbe steht, geht das viel kürzer.
Und wie schon geschrieben, arbeite das pandas-Tutorial durch, das beantwortet viele Deiner Fragen.
Der to_string-Aufruf ist nutzlos, weil Du mit dem Ergebnis gar nichts machst. Die umwandlung nach datetime sollte schon beim Lesen gemacht werden. Wenn man nicht alle Spalten raucht, dann gibt man die an, die man raucht.
Dateien öffnet man immer innerhalb eines with-Statements, mit file machst Du aber gar nichts.
Wenn man über einen Index iteriert macht man etwas falsch! Besonders mit pandas. Will man wirklich mit jedem Datensatz etwas machen, dann gibt es itertuples.
continue sollte man nicht benutzen. Hier wäre der offensichtliche Ersatz elif, aber da sowieso in jedem if-Block das selbe steht, geht das viel kürzer.
Code: Alles auswählen
import pandas as pd
df=pd.read_csv(r'file.csv', parse_dates=["Time"], usecols=["Time", "Status"])
del df['Event Data']
df = df.dropna()
for row in df.itertuples():
print (row.Status, row.Time)