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'

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')

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

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)

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.


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.