Eu tenho um enorme quadro de dados com muitas colunas, muitas das quais são do tipo datetime.datetime
. O problema é que muitos também têm tipos mistos, incluindo, por exemplo, datetime.datetime
valores e None
valores (e potencialmente outros valores inválidos):
0 2017-07-06 00:00:00
1 2018-02-27 21:30:05
2 2017-04-12 00:00:00
3 2017-05-21 22:05:00
4 2018-01-22 00:00:00
...
352867 2019-10-04 00:00:00
352868 None
352869 some_string
Name: colx, Length: 352872, dtype: object
Portanto, resultando em uma object
coluna de tipo. Isso pode ser resolvido com df.colx.fillna(pd.NaT)
. O problema é que o quadro de dados é muito grande para procurar colunas individuais.
Outra abordagem é usar pd.to_datetime(col, errors='coerce')
, no entanto, isso será convertido para datetime
muitas colunas que contêm valores numéricos.
Eu também poderia fazer df.fillna(float('nan'), inplace=True)
, embora as colunas que contêm datas ainda sejam do object
tipo e ainda tenham o mesmo problema.
Que abordagem que eu poderia seguir para elenco para datetime aquelas colunas cujos valores realmente conter datetime
valores, mas também pode conter None
, e eventualmente alguns valores inválidos (mencionando pois caso contrário um pd.to_datetime
em um try
/ except
cláusula faria)? Algo como uma versão flexível dopd.to_datetime(col)
datetime.datetime
oupandas._libs.tslibs.timestamps.Timestamp
? Se o primeiro, minha recomendação seria alterar o que criou a data e hora para o tipo quepandas
lida um pouco melhor.None
colunas são reaisNone
ou de string?None
, não cordas. Potencialmente pode haver valores errados também ... @erfandatetime
e contémvalues
?Respostas:
O principal problema que vejo é ao analisar valores numéricos.
Eu proporia convertê-los em seqüências de caracteres primeiro
Configuração
Solução
fonte
pd.to_datetime
ecoerce
os erros, desde que existam muitos. O problema estava nas colunas numéricas. Mas não me ocorreu que colunas numéricas convertidas em string não sejam analisadas pelos pandasto_datetime
. Muito obrigado, isso realmente ajuda!Essa função definirá o tipo de dados de uma coluna para datetime, se algum valor na coluna corresponder ao padrão de regex (\ d {4} - \ d {2} - \ d {2}) + (por exemplo, 01-01-2019 ) Agradeça a esta resposta sobre como pesquisar por seqüência de caracteres em todas as colunas do Pandas DataFrame e o filtro que ajudou na configuração e aplicação da máscara.
Trabalhando com a sugestão de uso
dateutil
, isso pode ajudar. Ele ainda está trabalhando com a suposição de que, se houver algum valor semelhante a uma data em uma coluna, essa coluna deve ser uma data e hora. Tentei considerar diferentes métodos de iterações de dataframe que são mais rápidos. Acho que esta resposta em Como iterar sobre linhas em um DataFrame no Pandas fez um bom trabalho descrevendo-as.Observe que
dateutil.parser
usará o dia ou o ano atual para quaisquer cadeias de caracteres como 'dezembro' ou 'novembro de 2019' sem valores de ano ou dia.Caso você também queira usar os valores de data
dateutil.parser
e hora de , você pode adicionar isto:fonte
dateutil
módulo mencionado por @Serge parece que poderia ser útil.dateutil.parse
identificar muitos tipos diferentes de cadeias de datas.