Pour convertir numpy.datetime64
à datetime
qui représente le temps en UTC sur numpy-1.8
:
>>> from datetime import datetime
>>> import numpy as np
>>> dt = datetime.utcnow()
>>> dt
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> dt64 = np.datetime64(dt)
>>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
>>> ts
1354650685.3624549
>>> datetime.utcfromtimestamp(ts)
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> np.__version__
'1.8.0.dev-7b75899'
L'exemple ci-dessus suppose qu'un naïf datetime
est interprété par np.datetime64
comme temps en UTC.
Pour convertir datetime
à np.datetime64
et retour ( numpy-1.6
) :
>>> np.datetime64(datetime.utcnow()).astype(datetime)
datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)
Il fonctionne à la fois sur un seul np.datetime64
et un tableau numpy de np.datetime64
.
Pensez à np.datetime64
de la même manière que vous le feriez pour np.int8
, np.int16
etc. et appliquer les mêmes méthodes pour convertir les objets Python tels que int
, datetime
et les objets numpy correspondants.
Votre "méchant exemple" fonctionne correctement :
>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
datetime.datetime(2002, 6, 28, 0, 0)
>>> numpy.__version__
'1.6.2' # current version available via pip install numpy
Je peux reproduire le long
valeur sur numpy-1.8.0
installé comme :
pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev
Le même exemple :
>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
1025222400000000000L
>>> numpy.__version__
'1.8.0.dev-7b75899'
Il retourne long
car pour numpy.datetime64
type .astype(datetime)
est équivalent à .astype(object)
qui renvoie un entier Python ( long
) sur numpy-1.8
.
Pour obtenir datetime
objet que vous pourriez :
>>> dt64.dtype
dtype('<M8[ns]')
>>> ns = 1e-9 # number of seconds in a nanosecond
>>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
datetime.datetime(2002, 6, 28, 0, 0)
Pour obtenir datetime64
qui utilise directement les secondes :
>>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
>>> dt64.dtype
dtype('<M8[s]')
>>> datetime.utcfromtimestamp(dt64.astype(int))
datetime.datetime(2002, 6, 28, 0, 0)
El documentation sur numpy dire que l'API datetime est expérimentale et peut changer dans les futures versions de numpy.
3 votes
Vous devriez probablement accepter La réponse de @Wes McKinney qui est beaucoup plus court et qui devrait fonctionner sur des
numpy
,pandas
versions.0 votes
@J.F.Sebastian Hmmm, cela signifie-t-il que la réponse est "ne pas passer de np.datetime à datetime"... utiliser simplement pd.Timestamp (car c'est une sous-classe de datetime de toute façon), ou si vous devez vraiment utiliser
pd.Timestamp(dt64).to_datetime()
. Je suis toujours un peu insatisfait à ce sujet, mais il est certain que celle de Wes est moins spécifique à mon ancien problème (et donc meilleure pour le monde) ! Merci encore d'avoir pris le temps d'y répondre :)0 votes
Votre question dit "ou
Timestamp
" yTimestamp
est undatetime
(une sous-classe de) de toute façon :)5 votes
Pour ceux qui viennent à cette question en 2017+, regardez ma réponse ci-dessous pour un tutoriel détaillé de datetime, datetime64 et Timestamps : stackoverflow.com/a/46921593/3707607
0 votes
Pour Numpy -> datetime, à partir de 2020, la conversion en str est l'option la plus élégante.