web-dev-qa-db-fra.com

Convertir numpy.datetime64 en objet chaîne dans python

J'ai du mal à convertir un python datetime64 objet dans une chaîne. Par exemple:

t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')

Dans:

'2012.07.01' as a  string. (note time difference)

J'ai déjà essayé de convertir le datetime64 objet à un datetime long puis à une chaîne, mais il semble que j'obtienne cette erreur:

dt = t.astype(datetime.datetime) #1341100800000000000L
time.ctime(dt)
ValueError: unconvertible time
39
cs_newbie

La solution était:

import pandas as pd 
ts = pd.to_datetime(str(date)) 
d = ts.strftime('%Y.%m.%d')
55
cs_newbie

Si vous ne voulez pas faire cette conversion charabia et êtes d'accord avec un seul format de date, c'était la meilleure solution pour moi

str(t)[:10]
Out[11]: '2012-07-01'
28
citynorman

Je voulais une chaîne au format ISO 8601 sans avoir besoin de dépendances supplémentaires. Mon numpy_array a un seul élément en tant que datetime64. Avec l'aide de @ Wirawan-Purwanto, j'ai ajouté un peu:

from datetime import datetime   

ts = numpy_array.values.astype(datetime)/1000000000
return datetime.utcfromtimestamp(ts).isoformat() # "2018-05-24T19:54:48"
3
four43

Il y a une route sans utiliser de pandas; mais voir la mise en garde ci-dessous.

Eh bien, la variable t a une résolution de nanosecondes, qui peut être montrée par inspection en python:

>>> numpy.dtype(t)
dtype('<M8[ns]')

Cela signifie que la valeur intégrale de cette valeur est 10 ^ 9 fois l'horodatage UNIX. La valeur imprimée dans votre question donne cet indice. Le mieux est de diviser la valeur intégrale de t par 1 milliard, puis vous pouvez utiliser time.strftime:

>>> import time
>>> time.strftime("%Y.%m.%d", time.gmtime(t.astype(int)/1000000000))
2012.07.01

En l'utilisant, soyez conscient de deux hypothèses:

1) la résolution datetime64 est nanoseconde

2) l'heure stockée dans datetime64 est en UTC

Note 1 : Fait intéressant, les développeurs numpy ont décidé [1] que l'objet datetime64 Ayant une résolution supérieure à la microseconde sera converti en un type long, ce qui explique pourquoi t.astype(datetime.datetime) donne 1341100800000000000L. La raison en est que l'objet datetime.datetime Ne peut pas représenter avec précision une échelle de temps nanoseconde ou plus fine, car la résolution prise en charge par datetime.datetime N'est que de la microseconde.

Note 2 : Méfiez-vous des différentes conventions entre numpy 1.10 et antérieur vs 1.11 et ultérieur:

  • dans numpy <= 1.10, datetime64 est stocké en interne en UTC et imprimé en heure locale. L'analyse consiste à supposer l'heure locale si aucun TZ n'est spécifié, sinon le décalage de fuseau horaire est pris en compte.

  • dans numpy> = 1.11, datetime64 est stocké en interne en tant que valeur indépendante du fuseau horaire (secondes depuis le 1970-01-01 00:00 dans le fuseau horaire non spécifié) et imprimé en tant que tel. L'analyse temporelle ne suppose pas le fuseau horaire, bien que le décalage de fuseau horaire de style +NNNN Soit toujours autorisé et que la valeur soit convertie en UTC.

[1]: https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/datetime.c voir la routine convert_datetime_to_pyobject.

2
Wirawan Purwanto