Converti colonna Panda in DateTime


242

Ho un campo in un DataFrame Panda che è stato importato come formato stringa. Dovrebbe essere una variabile datetime. Come posso convertirlo in una colonna datetime e quindi filtrare in base alla data.

Esempio:

  • DataFrame Name: raw_data
  • Nome colonna: Mycol
  • Formato valore nella colonna: '05SEP2014: 00: 00: 00.000'

Risposte:


431

Usa la to_datetimefunzione, specificando un formato adatto ai tuoi dati.

raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

71
Nota: l' formatargomento non è richiesto. to_datetimeè intelligente. Vai avanti e provalo senza cercare di abbinare i tuoi dati.
samthebrand,

6
Al fine di evitare l' SettingWithCopyWarninguso delle @ Darth-behfans stackoverflow.com/a/42773096/4487805
Álvaro Loza

3
E se volessi solo tempo e non data?
FaCoffee,

5
Non tremendamente intelligente. Anche se parte della colonna è inequivocabilmente nel formato dayfirst = True, per impostazione predefinita sarà comunque dayfirst = False per gli altri nella stessa colonna. Pertanto, è più sicuro utilizzare una specifica di formato esplicita o almeno il parametro dayfirst.
CPBL,

10
Se si omette la stringa di formato, questa operazione potrebbe essere lenta con molti record. Questa risposta discute il perché. Sembra che infer_datetime_format=Truepotrebbe anche aumentare la velocità di analisi fino a ~ 5-10x (secondo i documenti di Panda) se non includi una stringa di formato.
atwalsh,

52

È possibile utilizzare il metodo DataFrame .apply()per operare sui valori in Mycol:

>>> 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
Grazie! Questo è bello perché è più ampiamente applicabile, ma l'altra risposta è stata più diretta. Ho avuto difficoltà a decidere quale mi è piaciuto di più :)
Chris,

2
Mi piace meglio questa risposta, perché produce un oggetto datetime invece di un oggetto
pandas.tslib.Timestamp

25

Se hai più di una colonna da convertire, puoi fare quanto segue:

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

funziona, tuttavia risulta in un avviso Python di Un valore sta tentando di essere impostato su una copia di una porzione da un DataFrame. Prova ad usare .loc[row_indexer,col_indexer] = valueinvece

Immagino che ciò sia dovuto a qualche indicizzazione concatenata.


3
Mi ci sono voluti alcuni tentativi, eppure funziona: raw_data.loc [:, 'Mycol'] = pd.to_datetime (raw_data ['Mycol'], format = '% d% b% Y:% H:% M:% S .% f ')
pinegulf il

9

Utilizzare la to_datetimefunzione Panda per analizzare la colonna come DateTime. Inoltre, utilizzandoinfer_datetime_format=True , rileverà automaticamente il formato e convertirà la colonna menzionata in DateTime.

import pandas as pd
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.