Konvertieren Sie die Pandas-Spalte in DateTime

241

Ich habe ein Feld in einem Pandas DataFrame, das als Zeichenfolgenformat importiert wurde. Es sollte eine datetime-Variable sein. Wie konvertiere ich es in eine Datums- / Uhrzeitspalte und filtere dann nach Datum.

Beispiel:

  • DataFrame-Name: raw_data
  • Spaltenname : Mycol
  • Werteformat in Spalte: '05SEP2014: 00: 00: 00.000'
Chris
quelle

Antworten:

430

Verwenden Sie die to_datetimeFunktion und geben Sie ein Format an, das Ihren Daten entspricht.

raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')
chrisb
quelle
70
Hinweis: Das formatArgument ist nicht erforderlich. to_datetimeist schlau. Probieren Sie es aus, ohne Ihre Daten abzugleichen.
Samthebrand
6
Um die SettingWithCopyWarningVerwendung zu vermeiden, verwenden Sie die @ darth-behfans stackoverflow.com/a/42773096/4487805
Álvaro Loza
3
Was ist, wenn Sie nur Zeit und nicht Datum wollen?
FaCoffee
5
Nicht besonders schlau. Auch wenn ein Teil der Spalte eindeutig im Format dayfirst = True vorliegt, wird für die anderen in derselben Spalte standardmäßig dayfirst = False verwendet. Daher ist es sicherer, eine explizite Formatspezifikation oder zumindest den Parameter dayfirst zu verwenden.
CPBL
10
Das Weglassen der Formatzeichenfolge kann dazu führen, dass dieser Vorgang bei vielen Datensätzen langsam ist. Diese Antwort beschreibt , warum. Sieht so aus, als infer_datetime_format=Truekönnte die Parsing-Geschwindigkeit (laut Pandas-Dokumenten) auch auf das ~ 5-10-fache erhöht werden, wenn Sie keine Formatzeichenfolge einfügen.
Atwalsh
52

Mit der DataFrame-Methode können Sie .apply()die Werte in Mycol bearbeiten:

>>> df = pd.DataFrame(['05SEP2014:00:00:00.000'],columns=['Mycol'])
>>> df
                    Mycol
0  05SEP2014:00:00:00.000
>>> import datetime as dt
>>> df['Mycol'] = df['Mycol'].apply(lambda x: 
                                    dt.datetime.strptime(x,'%d%b%Y:%H:%M:%S.%f'))
>>> df
       Mycol
0 2014-09-05
mechanisches Fleisch
quelle
1
Vielen Dank! Das ist schön, weil es allgemeiner anwendbar ist, aber die andere Antwort war direkter. Es fiel mir schwer zu entscheiden, was mir besser gefallen hat :)
Chris
2
Ich mag diese Antwort besser, weil sie ein datetime-Objekt im Gegensatz zu einem pandas.tslib.Timestamp-Objekt erzeugt
wesanyer
25

Wenn Sie mehr als eine Spalte konvertieren möchten, können Sie Folgendes tun:

df[["col1", "col2", "col3"]] = df[["col1", "col2", "col3"]].apply(pd.to_datetime)
Vlad Bezden
quelle
15
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

funktioniert, führt jedoch zu einer Python-Warnung: Ein Wert versucht, auf einer Kopie eines Slice aus einem DataFrame festgelegt zu werden. Versuchen Sie es .loc[row_indexer,col_indexer] = valuestattdessen

Ich würde vermuten, dass dies auf eine Verkettungsindizierung zurückzuführen ist.

Darth BEHFANS
quelle
2
Ich habe ein paar Versuche unternommen
Pinegulf
9

Verwenden Sie die Pandas- to_datetimeFunktion, um die Spalte als DateTime zu analysieren. Durch die Verwendung infer_datetime_format=Truewird das Format automatisch erkannt und die angegebene Spalte in DateTime konvertiert.

import pandas as pd
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
Prateek Sharma
quelle