web-dev-qa-db-fra.com

Comment convertir numpy datetime64 en datetime

Je suis essentiellement confronté au même problème publié ici: Conversion entre datetime, Timestamp et datetime64

mais je n'ai pas pu trouver de réponse satisfaisante, ma question comment extraire datetime du type numpy.datetime64:

si j'essaye:

np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime)

ça m'a donné: 1339999205453000000L

ma solution actuelle consiste à convertir datetime64 en chaîne, puis à nouveau à datetime. mais cela semble assez stupide.

12
user6396

Emprunt de Conversion entre datetime, Timestamp et datetime64

In [220]: x
Out[220]: numpy.datetime64('2012-06-17T23:00:05.453000000-0700')

In [221]: datetime.datetime.utcfromtimestamp(x.tolist()/1e9)
Out[221]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999)

Tenir compte des fuseaux horaires, je pense que c'est vrai. Ça a l'air plutôt maladroit.

astype('O') is better (I think) than tolist ()) `:

In [294]: datetime.datetime.utcfromtimestamp(x.astype('O')/1e9)
Out[294]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999)

ou pour obtenir datetime en local:

In [295]: datetime.datetime.fromtimestamp(x.astype('O')/1e9)

Mais dans le fichier test_datatime.pyhttps://github.com/numpy/numpy/blob/master/numpy/core/tests/test_datetime.py

Je trouve d'autres options - convertissez d'abord le datetime64 Général dans l'un des formats qui spécifient les unités:

In [296]: x.astype('M8[D]').astype('O')
Out[296]: datetime.date(2012, 6, 18)

In [297]: x.astype('M8[ms]').astype('O')
Out[297]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

Cela fonctionne pour les tableaux:

In [303]: np.array([[x,x],[x,x]],dtype='M8[ms]').astype('O')[0,1]
Out[303]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)
16
hpaulj

Notez que Timestamp IS une sous-classe de datetime.datetime donc le [4] fonctionnera généralement

In [4]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400'))
Out[4]: Timestamp('2012-06-18 06:00:05.453000')

In [5]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400')).to_pydatetime()
Out[5]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)
8
Jeff