Hoje, fiquei positivamente surpreso pelo fato de que, ao ler dados de um arquivo de dados (por exemplo), o pandas é capaz de reconhecer tipos de valores:
df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])
Por exemplo, pode ser verificado desta maneira:
for i, r in df.iterrows():
print type(r['col1']), type(r['col2']), type(r['col3'])
Em particular inteiro, flutuadores e seqüências de caracteres foram reconhecidos corretamente. No entanto, tenho uma coluna que tem datas no seguinte formato: 2013-6-4
. Essas datas foram reconhecidas como seqüências de caracteres (não como objetos de data python). Existe uma maneira de "aprender" pandas para datas reconhecidas?
df.iterrows()
e visualizá-los para cada linha, apenasdf.info()
uma vez.Respostas:
Você deve adicionar
parse_dates=True
, ouparse_dates=['column name']
ao ler, isso geralmente é suficiente para analisá-lo magicamente. Mas sempre existem formatos estranhos que precisam ser definidos manualmente. Nesse caso, você também pode adicionar uma função de analisador de datas, que é a maneira mais flexível possível.Suponha que você tenha uma coluna 'datetime' com sua string, então:
Dessa forma, você pode até combinar várias colunas em uma única coluna de data e hora; isso mescla uma coluna 'date' e 'time' em uma única coluna 'datetime':
Você pode encontrar diretrizes (ou seja, as letras a serem usadas para diferentes formatos) para
strptime
estrftime
nesta página .fonte
TypeError: strptime() argument 1 must be str, not float
infer_datetime_format
: "os pandas tentarão inferir o formato das seqüências de data e hora nas colunas". Isso pode ser usado em vez dedate_parser
.ISO 8601
formato, você não deve passarinfer_datetime_format
ou uma função de analisador - é muito mais lento do que permitir que os pandas lidem com isso (especialmente o último). O formato da data nesta resposta também se enquadra nessa categoriaTalvez a interface do pandas tenha mudado desde que o @Rutger respondeu, mas na versão que estou usando (0.15.2), a
date_parser
função recebe uma lista de datas em vez de um único valor. Nesse caso, seu código deve ser atualizado da seguinte maneira:fonte
O método read_csv do pandas é ótimo para analisar datas. Documentação completa em http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
você pode até ter partes diferentes da data em colunas diferentes e passar o parâmetro:
O sensor padrão de datas funciona muito bem, mas parece estar inclinado para os formatos de data norte-americanos. Se você mora em outro lugar, ocasionalmente pode ser pego pelos resultados. Tanto quanto me lembro, 1/6/2000 significa 6 de janeiro nos EUA, e não 1 de junho, onde moro. É inteligente o suficiente para alterá-los se datas como 23/6/2000 forem usadas. Provavelmente, é mais seguro permanecer com as variações de data AAAAMMDD. Desculpas aos desenvolvedores de pandas, aqui, mas eu não testei com datas locais recentemente.
você pode usar o parâmetro date_parser para passar uma função para converter seu formato.
fonte
dayfirst
como Verdadeiro para datas europeias / internacionais. pandas.pydata.org/pandas-docs/stable/generated/…Você pode usar
pandas.to_datetime()
como recomendado na documentação parapandas.read_csv()
:Demo:
fonte
Ao mesclar duas colunas em uma única coluna de data e hora, a resposta aceita gera um erro (pandas versão 0.20.3), pois as colunas são enviadas para a função date_parser separadamente.
Os seguintes trabalhos:
fonte
Sim - de acordo com a
pandas.read_csv
documentação :Portanto, se o seu csv tiver uma coluna chamada
datetime
e as datas2013-01-01T01:01
parecerem, por exemplo, executar isso fará com que os pandas (eu esteja na v0.19.2) selecionem a data e a hora automaticamente:df = pd.read_csv('test.csv', parse_dates=['datetime'])
Observe que você precisa passar explicitamente
parse_dates
; ele não funciona sem.Verifique com:
df.dtypes
Você deve ver que o tipo de dados da coluna é
datetime64[ns]
fonte
Se o desempenho é importante para você, certifique-se de tempo:
impressões:
Portanto, com a data no formato iso8601 (
%Y-%m-%d %H:%M:%S
aparentemente é uma data no formato iso8601, acho que o T pode ser descartado e substituído por um espaço), você não deve especificarinfer_datetime_format
(o que não faz diferença nos mais comuns, aparentemente) e passar o seu próprio analisador em apenas prejudica o desempenho. Por outro lado,date_parser
faz a diferença com formatos de dia não tão comuns. Certifique-se de tempo antes de otimizar, como de costume.fonte
Ao carregar o arquivo csv contém a coluna de data. Temos duas maneiras de fazer os pandas reconhecerem a coluna de data, ou seja,
Pandas explicitamente reconhecem o formato por arg
date_parser=mydateparser
Os pandas implícitos reconhecem o formato por
infer_datetime_format=True
Alguns dos dados da coluna de data
01/01/18
01/02/18
Aqui não sabemos as duas primeiras coisas. Pode ser mês ou dia. Portanto, neste caso, temos que usar o método 1: - Passagem explícita do formato
Método 2: - Implícito ou reconhecer automaticamente o formato
fonte