Convertissez numpy.datetime64 à string object en python
j'ai du mal à convertir un python datetime64
objet en chaîne de caractères. Par exemple:
t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')
En:
'2012.07.01' as a string. (note time difference)
j'ai déjà essayé de convertir le datetime64
objet datetime
long alors à une chaîne, mais il me semble que j'obtiens cette erreur:
dt = t.astype(datetime.datetime) #1341100800000000000L
time.ctime(dt)
ValueError: unconvertible time
4 réponses
Solution:
import pandas as pd
ts = pd.to_datetime(str(date))
d = ts.strftime('%Y.%m.%d')
Si vous ne voulez pas faire de conversion charabia et sont ok avec juste un format de date, c'était la meilleure solution pour moi
str(t)[:10]
Out[11]: '2012-07-01'
il y a une route sans pandas; mais voir la mise en garde ci-dessous.
eh Bien, le
>>> numpy.dtype(t)
dtype('<M8[ns]')
cela signifie que la valeur intégrale de cette valeur est 10^9 fois la valeur de timestamp UNIX. La valeur imprimée dans votre question donne cette indication. Votre meilleur pari est de diviser la valeur intégrale de t
de 1 milliard alors vous pouvez utiliser time.strftime
:
>>> import time
>>> time.strftime("%Y.%m.%d", time.gmtime(t.astype(int)/1000000000))
2012.07.01
en utilisant cela, être conscient de deux hypothèses:
1) la résolution datetime64 est nanoseconde
2) le temps stocké en datetime64 est en UTC
note de Côté 1: fait intéressant, les développeurs de numpy ont décidé [1] que datetime64
objet qui a une résolution supérieure à la microseconde sera converti en long
type, ce qui explique pourquoi t.astype(datetime.datetime)
les rendements 1341100800000000000L
. La raison en est que datetime.datetime
l'objet ne peut représenter avec précision une nanoseconde ou plus fine timescale, parce que la résolution soutenue par datetime.datetime
est seulement microseconde.
note de Côté 2: méfiez - vous des différentes conventions entre numpy 1.10 et earlier vs 1.11 et later:
in numpy <= 1.10, datetime64 est stocké en interne sous UTC, et imprimé en heure locale. Le Parsing suppose l'heure locale si aucun TZ n'est spécifié, sinon le décalage du fuseau horaire est pris en compte.
dans numpy >= 1.11, datetime64 est stocké en interne sous forme de valeur temps-agnostique (secondes depuis 1970-01-01 00:00 dans un fuseau horaire non spécifié), et imprimé comme tel. L'analyse du temps ne prend pas en compte le fuseau horaire, bien que
+NNNN
style fuseau horaire décalage est encore permis, et que la valeur est convertie à l'UTC.
[1]: https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/datetime.c voir routine convert_datetime_to_pyobject
.
je voulais une chaîne formatée ISO 8601 sans avoir besoin de dépendances supplémentaires. Mon numpy_array a un seul élément comme un datetime64. Avec l'aide de @Wirawan-Purwanto, j'ai ajouté juste un peu:
from datetime import datetime
ts = numpy_array.values.astype(datetime)/1000000000
return datetime.utcfromtimestamp(ts).isoformat() # "2018-05-24T19:54:48"