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
26
demandé sur Ninjakannon 2013-10-21 22:58:42

4 réponses

Solution:

import pandas as pd 
ts = pd.to_datetime(str(date)) 
d = ts.strftime('%Y.%m.%d')
40
répondu cs_newbie 2017-01-10 14:06:43

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'
14
répondu citynorman 2017-08-03 20:32:39

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.

2
répondu Wirawan Purwanto 2016-06-24 23:02:37

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"
1
répondu four43 2018-05-31 13:29:58