Como faço para converter um numpy.datetime64
objeto em um datetime.datetime
(ou Timestamp
)?
No código a seguir, crio objetos datetime, timestamp e datetime64.
import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)
In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)
In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>
In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')
Nota: é fácil obter a data e hora do carimbo de data / hora:
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
Mas como extraímos o datetime
ou Timestamp
de um numpy.datetime64
( dt64
)?
.
Atualização: um exemplo um tanto desagradável no meu conjunto de dados (talvez o exemplo motivador) parece ser:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
que deveria ser datetime.datetime(2002, 6, 28, 1, 0)
, e não demorou muito (!) ( 1025222400000000000L
) ...
numpy
,pandas
versões.pd.Timestamp(dt64).to_datetime()
. Ainda estou um pouco insatisfeito com isso, mas certamente o Wes 'é menos específico para o meu antigo problema (e, portanto, melhor para o mundo)! Obrigado novamente por reservar um tempo para responder. :)Timestamp
" eTimestamp
é umdatetime
(uma subclasse de) de qualquer maneira :)Respostas:
Para converter
numpy.datetime64
em objeto de data e hora que representa a hora no UTC emnumpy-1.8
:O exemplo acima pressupõe que um objeto de data e hora ingênuo seja interpretado
np.datetime64
como hora no UTC.Para converter datetime em np.datetime64 e back (
numpy-1.6
):Ele funciona tanto em um único objeto np.datetime64 quanto em uma matriz numpy de np.datetime64.
Pense em np.datetime64 da mesma maneira que faria com np.int8, np.int16, etc e aplique os mesmos métodos para converter entre objetos Python, como int, datetime e objetos numpy correspondentes.
O seu "exemplo desagradável" funciona corretamente:
Eu posso reproduzir o
long
valornumpy-1.8.0
instalado como:O mesmo exemplo:
Ele retorna
long
porque fornumpy.datetime64
type.astype(datetime)
é equivalente ao.astype(object)
que retorna Python integer (long
) onnumpy-1.8
.Para obter o objeto datetime, você pode:
Para obter datetime64 que usa segundos diretamente:
Os documentos numpy dizem que a API datetime é experimental e pode mudar em versões numpy futuras.
fonte
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, o que dá um longo (1025222400000000000L
) (!)type(dt64)
.dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
type(dt64)
énumpy.datetime64
edt64.astype(datetime)
é o mesmo longo int ...: snumpy.__version__
->'1.6.1'
Você pode apenas usar o construtor pd.Timestamp. O diagrama a seguir pode ser útil para esta e outras questões relacionadas.
fonte
pd.to_datetime
converte tudo parapd.Timestamp
. Umpd.Timestamp
objeto tem o métodoto_pydatetime
para reverter para umdatetime.datetime
objeto e umto_datetime64
método para o qual converternp.datetime64
.Bem-vindo ao inferno.
Você pode simplesmente passar um objeto datetime64 para
pandas.Timestamp
:Notei que isso não funciona corretamente no NumPy 1.6.1:
Além disso,
pandas.to_datetime
pode ser usado (isso está fora da versão dev, não verifique a v0.9.1):fonte
issubclass(pd.Timestamp, datetime)
éTrue
. E aTimestamp
própria classe temto_datetime()
método.pd.to_datetime('2012-05-01T01:00:00.000000+0100')
retornaTimestamp('2012-05-01 00:00:00')
pelo menos em pandas0.17.1
.Eu acho que poderia haver um esforço mais consolidado em uma resposta para explicar melhor a relação entre o módulo datetime do Python, o datetime64 / timedelta64 do numpy e os objetos Timestamp / Timedelta do pandas.
A biblioteca padrão de data e hora do Python
A biblioteca padrão de data e hora possui quatro objetos principais
Crie esses quatro objetos
Objetos datetime64 e timedelta64 de NumPy
O NumPy não possui objetos de data e hora separados, apenas um único objeto datetime64 para representar um único momento no tempo. O objeto datetime do módulo datetime possui precisão de microssegundos (um milionésimo de segundo). O objeto datetime64 do NumPy permite que você defina sua precisão de horas até attossegundos (10 ^ -18). Seu construtor é mais flexível e pode receber uma variedade de entradas.
Construir objetos datetime64 e timedelta64 de NumPy
Passe um número inteiro com uma sequência para as unidades. Veja todas as unidades aqui . Ele é convertido em muitas unidades após a época do UNIX: 1º de janeiro de 1970
Você também pode usar cadeias de caracteres desde que estejam no formato ISO 8601.
Timedeltas têm uma única unidade
Também pode criá-los subtraindo dois objetos datetime64
O Pandas Timestamp e Timedelta criam muito mais funcionalidades sobre o NumPy
Um carimbo de data / hora do panda é um momento muito semelhante a um datetime, mas com muito mais funcionalidade. Você pode construí-los com
pd.Timestamp
oupd.to_datetime
.pd.to_datetime
funciona de maneira muito semelhante (com mais algumas opções) e pode converter uma lista de strings em timestamps.Convertendo datetime do Python em datetime64 e Timestamp
Convertendo numpy datetime64 em datetime e Timestamp
Converter em carimbo de data / hora
Converter de carimbo de data e hora em datetime e datetime64
Isso é muito fácil, pois os timestamps dos pandas são muito poderosos
fonte
Para
DatetimeIndex
, otolist
retorna uma lista dedatetime
objetos. Para um únicodatetime64
objeto, ele retorna um únicodatetime
objeto.fonte
.item()
que é muito mais explícito (e ninguém pode vir por aí e começar a argumentar que deve retornar uma lista).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, o que dá um longo (1025222400000000000L
) (!).item()
(sugerido por @seberg).tolist()
depende de quais unidades o datetime64 usa, por exemplo,D
produzdatetime.date()
,us
(microssegundos) produzdatetime.datetime()
,ns
(nanossegundos) produzlong
. E as unidades mudam dependendo dos valores de entrada, por exemplo,numpy.datetime64('2012-05-01')
usos'D'
,numpy.datetime64('2012-05-01T00:00:00.000')
usosms
,numpy.datetime64('2012-05-01T00:00:00.000000000')
usosns
. Você pode abrir um problema se achar confuso.Se você deseja converter uma série inteira de horários do pandas em horários regulares do python, também pode usar
.to_pydatetime()
.Ele também suporta fusos horários:
NOTA : Se você estiver operando em uma série Pandas, não poderá acessar
to_pydatetime()
a série inteira. Você precisará chamar.to_pydatetime()
cada datetime64 individual usando uma compreensão de lista ou algo semelhante:fonte
Uma opção é usar
str
e, em seguidato_datetime
(ou similar):Nota: não é igual a
dt
porque se tornou "sensível a deslocamento" :Isso parece deselegante.
.
Atualização: isso pode lidar com o "exemplo desagradável":
fonte
Esta postagem existe há 4 anos e eu ainda tenho problemas com esse problema de conversão - portanto, o problema ainda está ativo em 2017, em algum sentido. Fiquei um pouco chocado que a documentação numpy não oferece prontamente um algoritmo de conversão simples, mas isso é outra história.
Me deparei com outra maneira de fazer a conversão que envolve apenas módulos
numpy
edatetime
, não é necessário importar pandas, o que me parece ser muito código para importar para uma conversão tão simples. Notei quedatetime64.astype(datetime.datetime)
retornará umdatetime.datetime
objeto se o originaldatetime64
estiver em unidades de microssegundo, enquanto outras unidades retornam um carimbo de data / hora inteiro. Eu uso o móduloxarray
para E / S de dados de arquivos Netcdf, que usa asdatetime64
unidades em nanossegundos que causam falha na conversão, a menos que você primeiro converta em unidades de microssegundo. Aqui está o código de conversão de exemplo,Ele foi testado apenas na minha máquina, que é o Python 3.6 com uma recente distribuição Anaconda de 2017. Eu olhei apenas para a conversão escalar e não verifiquei as conversões baseadas em matriz, embora eu ache que será bom. Também não observei o código fonte numpy datetime64 para ver se a operação faz sentido ou não.
fonte
Voltei a esta resposta mais vezes do que posso contar, então decidi criar uma turma rápida, que converte um
datetime64
valor Numpy em valor Pythondatetime
. Espero que ajude outras pessoas por aí.Vou guardar isso na minha mala de ferramentas, algo me diz que precisarei novamente.
fonte
ts.to_pydatetime()
use esta função para obter pythons objeto datetime nativo
fonte
replace() got an unexpected keyword argument 'tzinfo'
Algumas soluções funcionam bem para mim, mas o numpy depreciará alguns parâmetros. A solução que funciona melhor para mim é ler a data como data e hora do panda e excretar explicitamente o ano, mês e dia de um objeto do panda. O código a seguir funciona para a situação mais comum.
fonte
de fato, todos esses tipos de data e hora podem ser difíceis e potencialmente problemáticos (devem acompanhar cuidadosamente as informações do fuso horário). Aqui está o que eu fiz, embora eu admita que estou preocupado que pelo menos parte dela seja "não por design". Além disso, isso pode ser um pouco mais compacto, conforme necessário. começando com um numpy.datetime64 dt_a:
numpy.datetime64 ('2015-04-24T23: 11: 26.270000-0700')
datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)
... e, é claro, isso pode ser compactado em uma linha, conforme necessário.
fonte
edit
para estar em conformidade com: formatação de código, formatação de citação e formatação de texto. Além disso, adote a capitalização, gramática e verificação de erros de digitação adequados, de acordo com as diretrizes da SO - consulte: Como postar e codificar amostras