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
La solution était:
import pandas as pd
ts = pd.to_datetime(str(date))
d = ts.strftime('%Y.%m.%d')
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'
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"
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
.