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'

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

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

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)

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.


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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.