Comment convertir un numpy.datetime64
objet en datetime.datetime
(ou Timestamp
)?
Dans le code suivant, je crée des objets datetime, timestamp et datetime64.
import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)
In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)
In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>
In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')
Remarque: il est facile d'obtenir l'heure et la date de l'horodatage:
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
Mais comment extraire le datetime
ou Timestamp
d'un numpy.datetime64
( dt64
)?
.
Mise à jour: un exemple un peu méchant dans mon jeu de données (peut-être l'exemple motivant) semble être:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
ce qui devrait être datetime.datetime(2002, 6, 28, 1, 0)
, et pas longtemps (!) ( 1025222400000000000L
) ...
numpy
, lespandas
versions.pd.Timestamp(dt64).to_datetime()
. Je suis encore un peu insatisfait de cela, mais Wes est certainement moins spécifique à mon ancien problème (et donc meilleur pour le monde)! Merci encore d'avoir pris le temps d'y répondre. :)Timestamp
" etTimestamp
est unedatetime
(une sous-classe de) de toute façon :)Réponses:
Pour convertir
numpy.datetime64
en objet datetime qui représente l'heure en UTC surnumpy-1.8
:L'exemple ci-dessus suppose qu'un objet datetime naïf est interprété
np.datetime64
comme du temps en UTC.Pour convertir datetime en np.datetime64 et back (
numpy-1.6
):Il fonctionne à la fois sur un seul objet np.datetime64 et sur un tableau numpy de np.datetime64.
Pensez à np.datetime64 de la même manière que vous le feriez pour np.int8, np.int16, etc. et appliquez les mêmes méthodes pour convertir entre les objets Python tels que int, datetime et les objets numpy correspondants.
Votre "exemple désagréable" fonctionne correctement:
Je peux reproduire la
long
valeurnumpy-1.8.0
installée sur :Le même exemple:
Il renvoie
long
car fornumpy.datetime64
type.astype(datetime)
est équivalent à.astype(object)
celui qui renvoie Python integer (long
) onnumpy-1.8
.Pour obtenir un objet datetime, vous pouvez:
Pour obtenir datetime64 qui utilise directement les secondes:
Les documents numpy indiquent que l'API datetime est expérimentale et pourrait changer dans les futures versions de numpy.
la source
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, ce qui donne un long (1025222400000000000L
) (!)type(dt64)
.dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
type(dt64)
estnumpy.datetime64
etdt64.astype(datetime)
est le même long int ...: snumpy.__version__
->'1.6.1'
Vous pouvez simplement utiliser le constructeur pd.Timestamp. Le diagramme suivant peut être utile pour cette question et les questions connexes.
la source
pd.to_datetime
convertit toutpd.Timestamp
. Unpd.Timestamp
objet a la méthodeto_pydatetime
pour revenir à undatetime.datetime
objet et uneto_datetime64
méthode pour convertirnp.datetime64
.Bienvenue en enfer.
Vous pouvez simplement passer un objet datetime64 à
pandas.Timestamp
:J'ai remarqué que cela ne fonctionne pas correctement dans NumPy 1.6.1:
En outre,
pandas.to_datetime
peut être utilisé (ce qui est hors de la version dev, ne sont pas vérifiées v0.9.1):la source
issubclass(pd.Timestamp, datetime)
c'estTrue
. Et laTimestamp
classe elle-même a uneto_datetime()
méthode.pd.to_datetime('2012-05-01T01:00:00.000000+0100')
revientTimestamp('2012-05-01 00:00:00')
au moins chez les pandas0.17.1
.Je pense qu'il pourrait y avoir un effort plus consolidé dans une réponse pour mieux expliquer la relation entre le module datetime de Python, datetime64 / timedelta64 de numpy et les objets Timestamp / Timedelta des pandas.
La bibliothèque standard datetime de Python
La bibliothèque standard datetime a quatre objets principaux
Créez ces quatre objets
Objets datetime64 et timedelta64 de NumPy
NumPy n'a pas d'objets de date et d'heure séparés, juste un seul objet datetime64 pour représenter un seul instant dans le temps. L'objet datetime du module datetime a une précision en microsecondes (un millionième de seconde). L'objet datetime64 de NumPy vous permet de régler sa précision des heures jusqu'à attosecondes (10 ^ -18). Son constructeur est plus flexible et peut prendre une variété d'entrées.
Construire les objets datetime64 et timedelta64 de NumPy
Passez un entier avec une chaîne pour les unités. Voir toutes les unités ici . Il est converti en autant d'unités après l'époque UNIX: 1 janvier 1970
Vous pouvez également utiliser des chaînes tant qu'elles sont au format ISO 8601.
Les timedeltas ont une seule unité
Peut également les créer en soustrayant deux objets datetime64
Pandas Timestamp et Timedelta construisent beaucoup plus de fonctionnalités en plus de NumPy
Un horodatage pandas est un moment très semblable à un datetime mais avec beaucoup plus de fonctionnalités. Vous pouvez les construire avec
pd.Timestamp
oupd.to_datetime
.pd.to_datetime
fonctionne de manière très similaire (avec quelques options supplémentaires) et peut convertir une liste de chaînes en horodatages.Conversion de datetime Python en datetime64 et Timestamp
Conversion de numpy datetime64 en datetime et Timestamp
Convertir en horodatage
Conversion de timestamp en datetime et datetime64
C'est assez facile car les horodatages pandas sont très puissants
la source
Pour
DatetimeIndex
, letolist
renvoie une liste d'datetime
objets. Pour un seuldatetime64
objet, il renvoie un seuldatetime
objet.la source
.item()
ce qui est beaucoup plus explicite (et personne ne peut venir et commencer à argumenter qu'il devrait retourner une liste).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, ce qui donne un long (1025222400000000000L
) (!).item()
(suggéré par @seberg),.tolist()
dépend des unités utilisées par datetime64, par exemple,D
produitdatetime.date()
,us
(microsecondes) produitdatetime.datetime()
,ns
(nanosecondes) produitlong
. Et les unités changent en fonction des valeurs d'entrée, par exemple,numpy.datetime64('2012-05-01')
utilisations'D'
,numpy.datetime64('2012-05-01T00:00:00.000')
utilisationsms
,numpy.datetime64('2012-05-01T00:00:00.000000000')
utilisationsns
. Vous pouvez ouvrir un problème si vous le trouvez déroutant.Si vous souhaitez convertir une série entière d'heures de données pandas en heures régulières de python, vous pouvez également utiliser
.to_pydatetime()
.Il prend également en charge les fuseaux horaires:
REMARQUE : Si vous utilisez une série Pandas, vous ne pouvez pas appeler
to_pydatetime()
la série entière. Vous devrez appeler.to_pydatetime()
chaque datetime64 individuel en utilisant une compréhension de liste ou quelque chose de similaire:la source
Une option consiste à utiliser
str
, puisto_datetime
(ou similaire):Remarque: il n'est pas égal à
dt
car il est devenu "compatible avec le décalage" :Cela semble inélégant.
.
Mise à jour: cela peut traiter de "l'exemple désagréable":
la source
Ce message existe depuis 4 ans et j'ai toujours eu du mal avec ce problème de conversion - donc le problème est toujours actif en 2017 dans un certain sens. J'ai été quelque peu choqué que la documentation numpy n'offre pas facilement un algorithme de conversion simple, mais c'est une autre histoire.
Je suis tombé sur une autre façon de faire la conversion qui n'implique que des modules
numpy
etdatetime
, il ne nécessite pas d'importer des pandas, ce qui me semble être beaucoup de code à importer pour une conversion aussi simple. J'ai remarqué quedatetime64.astype(datetime.datetime)
retournera undatetime.datetime
objet si l'originaldatetime64
est en micro-secondes tandis que les autres unités renvoient un horodatage entier. J'utilise un modulexarray
pour les E / S de données à partir de fichiers Netcdf qui utilise lesdatetime64
unités en nanosecondes, ce qui fait échouer la conversion, sauf si vous convertissez d'abord en unités micro-secondes. Voici l'exemple de code de conversion,Il est uniquement testé sur ma machine, qui est Python 3.6 avec une récente distribution Anaconda 2017. Je n'ai regardé que la conversion scalaire et je n'ai pas vérifié les conversions basées sur les tableaux, même si je suppose que ce sera bon. Je n'ai pas non plus regardé le code source de numpy datetime64 pour voir si l'opération a du sens ou non.
la source
Je suis revenu à cette réponse plus de fois que je ne peux en compter, j'ai donc décidé de créer une petite classe rapide, qui convertit une
datetime64
valeur Numpy en valeur Pythondatetime
. J'espère que cela aide les autres là-bas.Je vais garder ça dans ma trousse à outils, quelque chose me dit que j'en aurai encore besoin.
la source
ts.to_pydatetime()
utiliser cette fonction pour obtenir un objet datetime natif pythons
la source
replace() got an unexpected keyword argument 'tzinfo'
Certaines solutions fonctionnent bien pour moi, mais numpy dépréciera certains paramètres. La solution qui fonctionne mieux pour moi est de lire la date en tant que date / heure pandas et d'excréter explicitement l'année, le mois et le jour d'un objet pandas. Le code suivant fonctionne pour la situation la plus courante.
la source
en effet, tous ces types de datetime peuvent être difficiles et potentiellement problématiques (doivent garder une trace précise des informations de fuseau horaire). voici ce que j'ai fait, bien que j'avoue que je crains qu'au moins une partie ne soit "pas par conception". aussi, cela peut être rendu un peu plus compact au besoin. commençant par un numpy.datetime64 dt_a:
numpy.datetime64 ('2015-04-24T23: 11: 26.270000-0700')
datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)
... et bien sûr, cela peut être compressé en une seule ligne au besoin.
la source
edit
conformer à la bonne mise en forme du code, à la mise en forme des devis et à la mise en forme du texte. En outre, s'il vous plaît adhérer à la capitalisation adéquate, la grammaire, et vérifier les fautes de frappe, selon les directives SO - voir: Comment publier et exemples de code