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.