2017-07-23 3 views
1

Ich versuche, einige Spalten in_datetime zu konvertieren, die durch read_csv als Objekte kommen. Die Spaltennamen enthalten bisher immer den Begriff DATE, _DT oder timestamp. Ich bin mir nicht sicher, wie ich die Serie, die ich konvertieren möchte, richtig ansprechen kann, wenn sie in der Liste enthalten ist.Anwenden von Pandas to_datetime auf alle Datumsspalten

Dies schlägt für unbekanntes Zeichenfolgenformat fehl, das nach meinem Verständnis durch Verweisen auf eine Zeichenfolge aus der Liste verursacht wird. Ich bin nicht sicher, was ich innerhalb der pd.to_datetime platzieren muss, um die Serie in jeder Iteration der Schleife angemessen zu referenzieren.

Antwort

2

Versuchen Sie folgendes:

PATTERN = r'DATE|_DT|TIMESTAMP' 
date_cols = [c for c in df.columns if re.search(PATTERN, c)] 

for col_name in date_cols: 
    df[col_name] = pd.to_datetime(df[col_name]) 

Wenn Sie eine Liste der Spaltennamen haben, dann durch laufen, jede Spalte zu aktualisieren.

2

können Sie reguläre Ausdrücke verwenden, um die Datumsspalten zu suchen, und dann apply durch eine Schleife verwenden und wandeln sie:

Beispiel:

df = pd.DataFrame({ 
    "DATE1":["2017-01-01"], 
    "XX_DT":["2017-01-01"], 
    "M_TIMESTAMP":["2017-01-01"], 
    "OTHERCOLUMN":[123], 
}) 
​ 
import re 
dt_cols = [col for col in df.columns if re.search("DATE|_DT|TIMESTAMP", col)] 
df[dt_cols] = df[dt_cols].apply(pd.to_datetime) 

df 
#  DATE1 M_TIMESTAMP OTHERCOLUMN  XX_DT 
#0 2017-01-01 2017-01-01   123 2017-01-01 

df.dtypes 
#DATE1   datetime64[ns] 
#M_TIMESTAMP datetime64[ns] 
#OTHERCOLUMN    int64 
#XX_DT   datetime64[ns] 
#dtype: object 
1

Entweder list(df), df.columns, oder einfach nur df Arbeit gleich gut. Sie müssen auch Regex nicht verwenden. Prüfen, ob jede Spalte ein bekanntes Muster enthält, ist ausreichend. Wenden Sie dann einfach .to_datetime auf die Spalten an, die den Datumsmustern entsprechen.

date_patterns = ('DATE', '_DT', 'TIMESTAMP') 
date_cols = [col for col in df if any(pattern in col for pattern in date_patterns)] 
df.loc[:, date_cols] = df.loc[:, date_cols].apply(lambda x: pd.to_datetime(x)) 
2

können Sie die sowie pd.Series Objekte str String Accessor auf pd.Index Objekte verwenden. pd.DataFrame.update aktualisiert den Datenrahmen df an Ort und Stelle mit dem übergebenen Argument. Also, was ich tue, ist das Schneiden des Datenrahmens mit einem booleschen Array, das durch Verwendung von pd.Index.str.contains mit einem Regex von 'DATE|_DT|TIMESTAMP' bestimmt wird. Dann wende ich pd.to_datetime an und aktualisiere den Datenrahmen.

df.update(
    df.loc[:, df.columns.str.contains('DATE|_DT|TIMESTAMP')].apply(pd.to_datetime) 
) 
1

noch kompakter, mein Mann

df.filter(regex ='DATE|_DT|TIMESTAMP', axis =1).apply(pd.to_datetime) 
+0

Achse = 1 ist Standard. Schöne, Plus One – piRSquared

Verwandte Themen