2017-09-13 1 views
1

Ich habe Mikrosekunden, die ich im Wesentlichen von einer Pandas-Spalte abgeschnitten werden soll. Ich habe versucht, etwas wie analyze_me['how_long_it_took_to_order'] = analyze_me['how_long_it_took_to_order'].apply(lambda x: x.replace(microsecond=0), aber zu diesem Fehler kam replace() takes no keyword arguments.Wie zu entfernen Mikrosekunden von Timedelta

Zum Beispiel: Ich möchte 00: 19: 58,582052 00.19.58 oder 00 werden: 19: 58,58

enter image description here

+0

Sie berücksichtigen sollten, um Ihre Daten zu Timedelta oder einem Zeitstempel zu ändern (wenn Sie haben das Datum zusammen mit) von String. Es gibt keinen guten Grund, es als String zu behalten. Dann können Sie den ausgezeichneten 'dt'-Accessor mit der' floor'-Methode zum Abschneiden verwenden. Siehe meine Antwort. –

Antwort

0

Ihre how_long_it_took_to_order Spalte scheint von string (object) dtype zu sein.

Also versuchen Sie dies:

analyze_me['how_long_it_took_to_order'] = \ 
    analyze_me['how_long_it_took_to_order'].str.split('.').str[0] 

oder:

analyze_me['how_long_it_took_to_order'] = \ 
    analyze_me['how_long_it_took_to_order'].str.replace('(\.\d{2})\d+', r'\1') 

für "Hundertstelsekunden", wie: 00:19:58.58

+0

Das sieht so aus, als würde es den Bruchteil vollständig entfernen. – pvg

+0

@pvg, ja, so habe ich verstanden: 'Ich möchte 00: 19: 58.582052 zu 00:19:58 oder 00: 19: 58.58' – MaxU

+0

werden Es ist ein wenig vage, aber der Titel sagt 'Mikrosekunden'. Die zweite Version der Zeichenfolge ist eine ohne Mikrosekunden (geht bis zu 100). – pvg

3

Ich glaube, Sie brauchen Ihre Zeichenfolge zu konvertieren, um eine Timedelta mit pd.to_timedelta und dann nutzen Sie den exzellenten dt-Accessor mit der floor-Methode, die basierend auf string abschneidet. Hier sind die ersten zwei Zeilen Ihrer Daten.

df['how_long_it_took_to_order'] = pd.to_timedelta(df['how_long_it_took_to_order']) 
df['how_long_it_took_to_order'].dt.floor('s') 

0 00:19:58 
1 00:25:09 

Kann auf die Hundertstelsekunde runden.

df['how_long_it_took_to_order'].dt.floor('10ms') 

0 00:19:58.580000 
1 00:25:09.100000 

Hier erstelle ich einige eine Reihe von timedeltas und verwenden Sie dann den dt Accessor mit dem floor Verfahren zur nächstgelegenen Mikrosekunde trunkieren nach unten.

d = pd.timedelta_range(0, periods=6, freq='644257us') 
s = pd.Series(d) 
s 

0   00:00:00 
1 00:00:00.644257 
2 00:00:01.288514 
3 00:00:01.932771 
4 00:00:02.577028 
5 00:00:03.221285 
dtype: timedelta64[ns] 

Jetzt

s.dt.floor('s') 

0 00:00:00 
1 00:00:00 
2 00:00:01 
3 00:00:01 
4 00:00:02 
5 00:00:03 
dtype: timedelta64[ns] 

gestutzt Wenn Sie auf den nächsten hundertstel Sekunde tun dies gestutzt werden soll:

s.dt.floor('10ms') 

0   00:00:00 
1 00:00:00.640000 
2 00:00:01.280000 
3 00:00:01.930000 
4 00:00:02.570000 
5 00:00:03.220000 
dtype: timedelta64[ns] 
+2

Es ist in Ordnung, wenn er Strings hat.Konvertiere es einfach zu Timedelta. Die Länge der Saite wird variabel sein, aber ein Timedelta ist genau –

+1

Dies scheint eine viel klarere Antwort zu sein im Gegensatz zu Munging Strings. – pvg

+0

Ich denke, diese Lösung wird nicht richtig funktionieren, da OP beide Zeichenfolgen nur Uhrzeit und Datum + Zeit hat - etwa so: 'pd.to_timedelta (['00: 19: 58.582052', '2014-10-26 13:51: 59.898924 ']) '- was nicht funktioniert ... – MaxU