Eu tenho um Dataframe, df, com a seguinte coluna:
df['ArrivalDate'] =
...
936 2012-12-31
938 2012-12-29
965 2012-12-31
966 2012-12-31
967 2012-12-31
968 2012-12-31
969 2012-12-31
970 2012-12-29
971 2012-12-31
972 2012-12-29
973 2012-12-29
...
Os elementos da coluna são pandas.tslib.Timestamp.
Quero incluir apenas o ano e o mês. Eu pensei que haveria uma maneira simples de fazer isso, mas não consigo descobrir.
Aqui está o que eu tentei:
df['ArrivalDate'].resample('M', how = 'mean')
Eu recebi o seguinte erro:
Only valid with DatetimeIndex or PeriodIndex
Então eu tentei:
df['ArrivalDate'].apply(lambda(x):x[:-2])
Eu recebi o seguinte erro:
'Timestamp' object has no attribute '__getitem__'
Alguma sugestão?
Edit: Eu meio que descobri isso.
df.index = df['ArrivalDate']
Em seguida, posso reamostrar outra coluna usando o índice.
Mas eu ainda gostaria de um método para reconfigurar a coluna inteira. Alguma ideia?
to_period
:df.date_column.dt.month
(ou.year
, ou.day
) funciona.dt.month
perde o ano embora. E.dt.to_period('M')
altera o tipo de dados para algo que não é mais um datetime64. Acabei usando a resposta de Juan sugerindo.astype('datetime64[M]')
truncar os valores.Respostas:
Se você deseja que novas colunas sejam exibidas ano e mês separadamente, faça o seguinte:
ou...
Então você pode combiná-los ou trabalhar com eles exatamente como são.
fonte
timeit
sugerem que aDatetimeIndex
abordagem é significativamente mais rápida que um.map/.apply
ou outro.dt
.df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
Melhor maneira encontrada !!
o
df['date_column']
deve estar no formato de data e hora.Você também pode usar o
D
dia,2M
por 2 meses etc. para diferentes intervalos de amostragem e, caso haja dados de séries temporais com registro de data e hora, podemos optar por intervalos de amostragem granulares, como45Min
45 minutos,15Min
15 minutos etc.fonte
datetime64
dtype. Usandodf.my_date_column.astype('datetime64[M]')
, como na resposta de @ Juan, converte-se em datas que representam o primeiro dia de cada mês.Você pode acessar diretamente o
year
emonth
atributos, ou solicitar umdatetime.datetime
:Uma maneira de combinar ano e mês é criar um número inteiro codificando-os, como:
201408
para agosto de 2014. Ao longo de uma coluna inteira, você pode fazer o seguinte:ou muitas variantes dos mesmos.
Porém, não sou muito fã disso, pois torna o alinhamento e a aritmética de datas dolorosos mais tarde e especialmente dolorosos para outras pessoas que acessam seu código ou dados sem a mesma convenção. Uma maneira melhor é escolher uma convenção do dia do mês, como o dia da semana final sem feriado nos EUA ou o primeiro dia etc. e deixar os dados em um formato de data / hora com a convenção de data escolhida.
O
calendar
módulo é útil para obter o valor numérico de determinados dias, como o dia da semana final. Então você pode fazer algo como:Se você estiver procurando uma maneira de resolver o problema mais simples de formatar apenas a coluna datetime em alguma representação estritificada, basta usar a
strftime
função dadatetime.datetime
classe da seguinte maneira:fonte
pandas
técnicas de combinação de aplicação e divisão. Minhas sugestões acima não devem ser consideradas como um endosso de que elas são as abordagens de melhor desempenho para o seu caso - apenas que são escolhas Pythonic estilisticamente válidas para uma variedade de casos.df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
.Se você deseja o par único do ano e do mês, o uso de apply é bastante elegante.
Produz mês-ano em uma coluna.
Não se esqueça de mudar primeiro o formato para data e hora antes, geralmente esqueço.
fonte
df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
Extraindo o ano, digamos de ['2018-03-04']
O df ['Ano'] cria uma nova coluna. Enquanto se você quiser extrair o mês, use .month
fonte
Você pode primeiro converter suas seqüências de datas com pandas.to_datetime , que fornece acesso a todos os recursos numpy datetime e timedelta . Por exemplo:
fonte
trunc
. Existe alguma documentação para aastype('datetime64[M]')
convenção?Graças a jaknap32 , eu queria agregar os resultados de acordo com o ano e o mês, então isso funcionou:
A saída foi organizada:
fonte
A solução do @ KieranPC é a abordagem correta para o Pandas, mas não é facilmente extensível a atributos arbitrários. Para isso, você pode usar
getattr
dentro de uma compreensão de gerador e combinar usandopd.concat
:fonte
Isso funcionou bem para mim, não achava que os pandas interpretariam a data resultante da string como data, mas quando eu fiz o enredo, ele conhecia muito bem minha agenda e a string year_month onde foi solicitada corretamente ... tenho que amar os pandas!
fonte
Há duas etapas para extrair o ano para todo o quadro de dados sem usar o método apply.
Passo 1
converta a coluna em datetime:
Passo 2
extrair o ano ou o mês usando o
DatetimeIndex()
métodofonte
ÚNICA LINHA: Adicionando uma coluna com pares 'ano-mês': ('pd.to_datetime' primeiro altera o dtype da coluna para data e hora antes da operação)
Assim, para uma coluna extra de 'ano' ou 'mês':
fonte