2016-06-27 18 views
1

Ich habe diese Antwort in der Gemeinschaft bisher gesucht, konnte nicht haben.Konvertieren String-Datum in ein anderes Format in Pandas Dataframe

Ich habe einen Datenrahmen in Python 3.5.1, der eine Spalte mit Datumsangaben in Zeichenfolge enthält, die aus einer CSV-Datei importiert werden.

Der Datenrahmen wie folgt aussieht

    TimeStamp TBD TBD  Value TBD 
0  2016/06/08 17:19:53 NaN NaN 0.062942 NaN 
1  2016/06/08 17:19:54 NaN NaN 0.062942 NaN 
2  2016/06/08 17:19:54 NaN NaN 0.062942 NaN 

was ich brauche, ist der Zeitstempel Spaltenformat zu ändern % m /% d /% y% H sein dürfen:% M:% D

    TimeStamp TBD TBD  Value TBD 
0  06/08/2016 17:19:53 NaN NaN 0.062942 NaN 

Bisher habe ich einige Lösungen gefunden, die aber für Streich- und nicht für Serie

Jede Hilfe

würde geschätzt funktioniert

Dank

Antwort

3

Wenn Sie die Spalte von Strings in einer Zeitreihe zu konvertieren, können Sie die dt.strftime method verwenden:

import numpy as np 
import pandas as pd 
nan = np.nan 
df = pd.DataFrame({'TBD': [nan, nan, nan], 'TBD.1': [nan, nan, nan], 'TBD.2': [nan, nan, nan], 'TimeStamp': ['2016/06/08 17:19:53', '2016/06/08 17:19:54', '2016/06/08 17:19:54'], 'Value': [0.062941999999999998, 0.062941999999999998, 0.062941999999999998]}) 
df['TimeStamp'] = pd.to_datetime(df['TimeStamp']).dt.strftime('%m/%d/%Y %H:%M:%S') 
print(df) 

ergibt

TBD TBD.1 TBD.2   TimeStamp  Value 
0 NaN NaN NaN 06/08/2016 17:19:53 0.062942 
1 NaN NaN NaN 06/08/2016 17:19:54 0.062942 
2 NaN NaN NaN 06/08/2016 17:19:54 0.062942 

Da Sie eine Spalte konvertieren möchten von Strings zu einer anderen (anderen) Stringsspalte können Sie auch die vektorisierte Methode str.replace verwenden:

import numpy as np 
import pandas as pd 
nan = np.nan 
df = pd.DataFrame({'TBD': [nan, nan, nan], 'TBD.1': [nan, nan, nan], 'TBD.2': [nan, nan, nan], 'TimeStamp': ['2016/06/08 17:19:53', '2016/06/08 17:19:54', '2016/06/08 17:19:54'], 'Value': [0.062941999999999998, 0.062941999999999998, 0.062941999999999998]}) 
df['TimeStamp'] = df['TimeStamp'].str.replace(r'(\d+)/(\d+)/(\d+)(.*)', r'\2/\3/\1\4') 
print(df) 

seit

In [32]: df['TimeStamp'].str.replace(r'(\d+)/(\d+)/(\d+)(.*)', r'\2/\3/\1\4') 
Out[32]: 
0 06/08/2016 17:19:53 
1 06/08/2016 17:19:54 
2 06/08/2016 17:19:54 
Name: TimeStamp, dtype: object 

Diese Regex verwendet Stücke der Zeichenfolge , ohne zuerst die Zeichenfolge als Datum Parsen neu zu ordnen. Dies ist schneller als die erste Methode (hauptsächlich weil es den Parsing-Schritt überspringt), aber es hat auch den Nachteil, nicht zu überprüfen, dass die Datumszeichenfolgen gültige Daten sind.

+0

Hallo @unutbu das hat funktioniert. Ja, ich bemerkte die Langsamkeit beim Ausführen der Zeile, auch wenn es fertig war. Ich habe es mit pd.to_datetime in datetime umgewandelt und es war sehr langsam im Vergleich zu df ['TimeStamp'] war eine Zeichenkette. Ist dieses Verfahren schneller als das Anwenden der str-Funktion über eine Schleife? speziell für einen Datenrahmen für Millionen von Datensätzen, eine Schleife zu machen, denke ich, ist keine gute Idee. – racekiller

+0

Rechts. Vermeide die Python-Schleife, wenn du kannst. Die Verwendung von 'DatetimeIndex.strftime' ist * viel * schneller als die Verwendung einer Python-Schleife, das Analysieren jeder Datumszeichenkette als Datum und das Aufrufen von' strftime'. – unutbu

+1

@unutbu Sie brauchen den 'DatetimeIndex' nicht,' strftime' ist auch vom '.dt' Accessor verfügbar. – joris

Verwandte Themen