Conversão Pandas Column para DateTime

241

Eu tenho um campo em um DataFrame do pandas que foi importado como formato de string. Deve ser uma variável datetime. Como faço para convertê-lo em uma coluna datetime e depois filtrar com base na data.

Exemplo:

  • Nome do DataFrame: raw_data
  • Nome da coluna: Mycol
  • Formato do valor na coluna: '05SEP2014: 00: 00: 00.000'
Chris
fonte

Respostas:

430

Use a to_datetimefunção, especificando um formato para corresponder aos seus dados.

raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')
chrisb
fonte
70
Nota: o formatargumento não é obrigatório. to_datetimeé inteligente. Vá em frente e tente sem tentar corresponder seus dados.
samthebrand
6
Para evitar o SettingWithCopyWarninguso do @ darth-behfans stackoverflow.com/a/42773096/4487805
Álvaro Loza
3
E se você só quer tempo e não data?
FaCoffee # 30/17
5
Não é terrivelmente inteligente. Mesmo que parte da coluna esteja inequivocamente no formato dayfirst = True, ela ainda será o padrão dayfirst = False para os outros na mesma coluna. Portanto, é mais seguro usar uma especificação de formato explícita ou pelo menos o parâmetro dayfirst.
CPBL
10
Omitir a sequência de formatação pode fazer com que esta operação seja lenta com muitos registros. Esta resposta discute o porquê. Parece que infer_datetime_format=Truetambém pode aumentar a velocidade de análise de ~ 5-10x (de acordo com os documentos do pandas) se você não incluir uma sequência de formato.
Atwalsh 5/05
52

Você pode usar o método DataFrame .apply()para operar com os valores em 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
carne_mecânica
fonte
1
Obrigado! Isso é bom porque é mais amplamente aplicável, mas a outra resposta foi mais direta. Eu tive um tempo duro decidir que eu gostei melhor :)
Chris
2
Eu gosto desta resposta melhor, porque produz um objeto de data e hora em oposição a um objeto pandas.tslib.Timestamp
wesanyer
25

Se você tiver mais de uma coluna a ser convertida, faça o seguinte:

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

funciona, no entanto, resulta em um aviso Python de que Um valor está tentando ser definido em uma cópia de uma fatia de um DataFrame. Tente usar .loc[row_indexer,col_indexer] = valuevez

Eu acho que isso é devido a alguma indexação de encadeamento.

Darth BEHFANS
fonte
2
Levei algumas tentativas, mas isso funciona: raw_data.loc [:, 'Mycol'] = pd.to_datetime (raw_data ['Mycol']], formato = '% d% b% Y:% H:% M:% S .% f ')
pinegulf em 21/01
9

Use a to_datetimefunção pandas para analisar a coluna como DateTime. Além disso, ao usar infer_datetime_format=True, ele detectará automaticamente o formato e converterá a coluna mencionada em DateTime.

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