Peguei minha série e coagi para uma coluna datetime de dtype = datetime64[ns]
(embora só precise de resolução de dia ... não tenho certeza de como mudar).
import pandas as pd
df = pd.read_csv('somefile.csv')
column = df['date']
column = pd.to_datetime(column, coerce=True)
mas a plotagem não funciona:
ipdb> column.plot(kind='hist')
*** TypeError: ufunc add cannot use operands with types dtype('<M8[ns]') and dtype('float64')
Eu gostaria de traçar um histograma que mostre apenas a contagem de datas por semana, mês ou ano .
Certamente há uma maneira de fazer isso pandas
?
python
pandas
matplotlib
time-series
montanha-russa
fonte
fonte
Respostas:
Dado este df:
e, se ainda não for o caso:
Para mostrar a contagem de datas por mês:
.dt
permite que você acesse as propriedades de data e hora.O que lhe dará:
Você pode substituir mês por ano, dia, etc.
Se você quiser distinguir ano e mês, por exemplo, basta fazer:
Que dá:
Era isso que você queria? Isso está claro?
Espero que isto ajude !
fonte
date
ouDate
aqui estão os nomes das colunas, então se a sua coluna com datas for chamada foo, seria:df.foo.dt.month
groupby
combinações de dois atributos de dados de colunas (por exemplo: ano e data)?Acho que resample pode ser o que você está procurando. No seu caso, faça:
É apenas fazer a contagem e não o plot, então você tem que fazer seus próprios plotagens.
Veja este post para mais detalhes sobre a documentação da resample pandas resample documentação
Eu tive problemas semelhantes aos de você. Espero que isto ajude.
fonte
how
está obsoleto. A nova sintaxe édf.resample('1M').count()
Exemplo renderizado
Código de exemplo
fonte
Consegui contornar isso (1) plotando com matplotlib em vez de usar o dataframe diretamente e (2) usando o
values
atributo. Consultar exemplo:Isso não funciona se eu não usar
values
, mas não sei por que funciona.fonte
Aqui está uma solução para quando você deseja apenas ter um histograma como o esperado. Isso não usa groupby, mas converte os valores de data e hora em inteiros e altera os rótulos no gráfico. Alguma melhoria pode ser feita para mover os rótulos de escala para locais regulares. Além disso, com a abordagem, um gráfico de estimativa de densidade de kernel (e qualquer outro gráfico) também é possível.
fonte
Acho que, para resolver esse problema, você pode usar este código, ele converte o tipo de data em tipos int:
apenas para obter a data, você pode adicionar este código:
fonte
Eu também estava tendo problemas com isso. Imagino que, como você está trabalhando com datas, deseja preservar a ordem cronológica (como eu fiz).
A solução alternativa é
Por favor, se alguém souber de uma maneira melhor, fale.
EDITAR: para jean acima, aqui está uma amostra dos dados [eu fiz uma amostra aleatória do conjunto de dados completo, daí os dados triviais do histograma.]
Resultado:
fonte
Todas essas respostas parecem excessivamente complexas, pelo menos com pandas 'modernos' são duas linhas.
fonte
DataFrame
, mas não se tudo o que você tiver for umSeries
. Você consideraria adicionar uma nota sobre esse caso?