Eu uso pandas.to_datetime
para analisar as datas nos meus dados. Por padrão, os pandas representam as datas datetime64[ns]
, embora as datas sejam apenas diárias. Gostaria de saber se existe uma maneira elegante / inteligente de converter as datas para datetime.date
ou datetime64[D]
para que, quando eu escrevo os dados em CSV, as datas não sejam anexadas 00:00:00
. Eu sei que posso converter o tipo manualmente, elemento por elemento:
[dt.to_datetime().date() for dt in df.dates]
Mas isso é muito lento, pois tenho muitas linhas e meio que derrota o propósito de usar pandas.to_datetime
. Existe uma maneira de converter a dtype
coluna inteira de uma só vez? Ou, como alternativa, pandas.to_datetime
suporta uma especificação de precisão para que eu possa me livrar da parte do tempo enquanto trabalho com dados diários?
df.dates.apply(lambda x: x.date())
deve ser pelo menos um pouco mais rápido. também dê uma olhada em github.com/pydata/pandas/issues/2583Respostas:
Desde a versão,
0.15.0
agora isso pode ser feito facilmente usando.dt
para acessar apenas o componente de data:O exemplo acima retorna um
datetime.date
dtype; se você deseja obter umdatetime64
, é possível apenasnormalize
o componente de horário para meia-noite, para que ele defina todos os valores para00:00:00
:Isso mantém o tipo,
datetime64
mas a tela mostra apenas odate
valor.fonte
Solução Simples:
fonte
Embora eu tenha votado positivamente na resposta de EdChum, que é a resposta mais direta à pergunta feita pelo OP, ele realmente não resolve o problema de desempenho (ainda depende de
datetime
objetos python e, portanto, qualquer operação neles não será vetorizada - ou seja, será lento).Uma alternativa com melhor desempenho é usar
df['dates'].dt.floor('d')
. Estritamente falando, ele "não mantém apenas parte da data", pois apenas define a hora00:00:00
. Mas funciona como desejado pelo OP quando, por exemplo:groupby
... e é muito mais eficiente, pois a operação é vetorizada.
EDIT: na verdade, a resposta do OP teria preferido é, provavelmente, "versões recentes do
pandas
que não escrever o tempo para csv se é00:00:00
para todas as observações".fonte
to_json
ainda escreve a íntegra00:00:00
.date_format='iso'
?! Por padrão, ele gera apenas segundos desde a época.dt.normalize()
em séries com mais de algumas centenas de elementos.Pandas
DatetimeIndex
eSeries
tem um método chamadonormalize
que faz exatamente o que você deseja.Você pode ler mais sobre isso nesta resposta .
Pode ser usado como
ser.dt.normalize()
fonte
Pandas v0.13 +: use
to_csv
com odate_format
parâmetroEvite, sempre que possível, converter sua
datetime64[ns]
série em umaobject
série de tipos dedatetime.date
objetos. O último, geralmente construído usandopd.Series.dt.date
, é armazenado como uma matriz de ponteiros e é ineficiente em relação a uma série pura baseada em NumPy.Como sua preocupação é o formato ao gravar em CSV , use o
date_format
parâmetro deto_csv
. Por exemplo:Veja as
strftime
diretrizes do Python para convenções de formatação.fonte
Esta é uma maneira simples de extrair a data:
fonte
Convertendo para
datetime64[D]
:Embora a atribuição novamente a um col DataFrame o reverta para [ns].
Se você queria real
datetime.date
:fonte
dt
, este snipet de resposta substituirá esse módulo! @ Dale-Jung, talvez pudesse mudar a linha para algo como dt_indexdf.loc[date]
método, as reverte índice de volta para um timestamp, ou seja, comparações posteriores não funcionam maisBasta dar uma resposta mais atualizada caso alguém veja este post antigo.
Adicionar "utc = False" ao converter para datetime removerá o componente de fuso horário e manterá apenas a data no tipo de dados datetime64 [ns].
Você poderá salvá-lo no Excel sem receber o erro "ValueError: O Excel não oferece suporte a horários com fusos horários. Verifique se o horário está inconsciente antes de gravar no Excel".
fonte
Queria poder alterar o tipo de um conjunto de colunas em um quadro de dados e remover o horário mantendo o dia. redondo (), piso (), teto () todo o trabalho
fonte