La conversion entre datetime, Timestamp et datetime64
Comment puis-je convertir un numpy.datetime64
objet d'un datetime.datetime
(ou Timestamp
)?
Dans le code suivant, j'ai créer un datetime, timestamp et datetime64 objets.
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 la date de l'Horodatage:
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
Mais comment pouvons-nous extraire les datetime
ou Timestamp
à partir d'un numpy.datetime64
(dt64
)?
.
Mise à jour: un peu méchant exemple dans ma base de données (peut-être la motivation exemple) semble être:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
qui devrait être datetime.datetime(2002, 6, 28, 1, 0)
, et non pas une longue (!) (1025222400000000000L
)...
- vous devriez probablement accepter @Wes McKinney réponse qui est beaucoup plus courte et devrait fonctionner sur les récentes
numpy
,pandas
versions. - Hmmm, est-ce à dire que la réponse est "ne pas bouger de np.datetime datetime"... il suffit d'utiliser la mp.Timestamp (comme c'est une sous-classe de datetime de toute façon), ou si vous devez vraiment utiliser
pd.Timestamp(dt64).to_datetime()
. Je suis toujours un peu insatisfaits sur ce sujet, mais certainement de Wes est moins spécifique à mon ancien problème (pour le monde)! Merci encore de prendre le temps de répondre. 🙂 - Votre question dit "ou
Timestamp
" etTimestamp
est undatetime
(une sous-classe) de toute façon 🙂 - Pour ceux qui viennent à cette question en 2017+, regarde ma réponse ci-dessous pour un tutoriel détaillé de datetime, datetime64 et les Horodatages: stackoverflow.com/a/46921593/3707607
Vous devez vous connecter pour publier un commentaire.
Pour convertir
numpy.datetime64
pour objet datetime qui représente l'heure UTC surnumpy-1.8
:L'exemple ci-dessus suppose que le naïf objet datetime est interprété par
np.datetime64
que l'heure UTC.Pour convertir datetime pour les np.datetime64 et à l'arrière (
numpy-1.6
):Il fonctionne à la fois sur un seul np.datetime64 objet et un tableau numpy de np.datetime64.
Pense de np.datetime64 de la même manière que vous le feriez sur np.int8, np.int16, etc et d'appliquer les mêmes méthodes pour convertir entre Python objets tels que int, datetime et correspondant numpy objets.
Votre "méchant exemple" fonctionne correctement:
Je peux reproduire le
long
valeur surnumpy-1.8.0
installé comme:Le même exemple:
Il retourne
long
parce que pournumpy.datetime64
type.astype(datetime)
est équivalent à.astype(object)
qui renvoie Python entier (long
) surnumpy-1.8
.Pour obtenir l'objet datetime vous pouvez:
Pour obtenir datetime64 qui utilise secondes directement:
La numpy docs dire que la date /heure API est expérimental et peut changer dans le futur numpy versions.
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, qui donne une longue (1025222400000000000L
) (!)type(dt64)
.dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
numpy.datetime64
etdt64.astype(datetime)
est le même long int... :snumpy.__version__
->'1.6.1'
datetime.datetime.utcfromtimestamp
, je vois deux erreurs: (1)TypeError: don't know how to convert scalar number to float
quand j'ai essayer de passer dans la inchangéenp.datetime64
et puis (2)ValueError: year is out of range
lorsque j'essaie d'abord à l'aide de.astype(int)
. La date du test est pour 2012:xx = numpy.datetime64(datetime.date(2012,1,31))
si l'année est parfaitement valide. Je suis à l'aide de NumPy 1.6.1.Vous pouvez simplement utiliser les mp.Timestamp constructeur. Le diagramme suivant peut être utile à cet effet et de questions connexes.
pd.Timestamp()
changements np.datetime mp.Timestamppd.to_datetime
convertit tout àpd.Timestamp
. Unpd.Timestamp
objet a la méthodeto_pydatetime
pour revenir à unedatetime.datetime
objet et unto_datetime64
méthode pour convertirnp.datetime64
.string
-> mappages sur elle. Essayez ces:x = pd.to_datetime('2012-05-01T01:00:00.000000+0100'); print(type(x)); print(type(x.to_datetime());
-- le premier est unclass 'pandas._libs.tslib.Timestamp'
et le second est unclass 'datetime.datetime'
. (Et vous obtenez un avertissement queto_datetime()
est déconseillé pourto_pydatetime()
) (Dans les Pandas 0.22.0 et Python 3.5.2)Bienvenue en enfer.
Vous pouvez passer un datetime64 objet de
pandas.Timestamp
:J'ai remarqué que cela ne fonctionne pas bien dans NumPy 1.6.1:
Aussi,
pandas.to_datetime
peut être utilisé (ce qui est hors de la dev version, vous n'avez pas vérifié v0.9.1):issubclass(pd.Timestamp, datetime)
estTrue
. EtTimestamp
classe elle-même ato_datetime()
méthode.pd.to_datetime('2012-05-01T01:00:00.000000+0100')
retourneTimestamp('2012-05-01 00:00:00')
au moins dans les pandas0.17.1
.Je pense qu'il pourrait être un plus consolidée de l'effort dans une réponse afin de mieux expliquer la relation entre Python module datetime, numpy est datetime64/timedelta64 et les pandas' Timestamp/Timedelta objets.
Datetime bibliothèque standard de Python
Datetime de la bibliothèque standard a quatre principaux objets
Créer ces quatre objets
NumPy est datetime64 et timedelta64 objets
NumPy n'a pas d'autre date et l'heure des objets, un seul datetime64 objet pour représenter un seul moment dans le temps. Le module datetime de l'objet datetime a la microseconde de précision (un millionième de seconde). NumPy est datetime64 objet permet de définir la précision des heures, tout le chemin à attoseconds (10 ^ -18). Son constructeur est plus flexible et peut prendre une variété d'entrées.
Construire NumPy est datetime64 et timedelta64 objets
Passer d'un nombre entier avec une chaîne pour les unités. Voir toutes les unités ici. Il est converti que de nombreuses unités après l'époque UNIX: 1 janvier 1970
Vous pouvez également utiliser des chaînes, aussi longtemps qu'ils sont au format ISO 8601.
Timedeltas ont une seule unité
Pouvez aussi créer par la soustraction de deux datetime64 objets
Pandas Horodatage et Timedelta construire beaucoup plus de fonctionnalités sur le dessus de NumPy
Une pandas Timestamp est un moment très similaire à un datetime, mais avec beaucoup plus de fonctionnalités. Vous pouvez construire avec
pd.Timestamp
oupd.to_datetime
.pd.to_datetime
fonctionne de manière similaire (avec un peu plus d'options) et permet de convertir une liste de chaînes de caractères dans les Horodatages.La conversion de Python datetime pour datetime64 et Timestamp
La conversion de numpy datetime64 de type datetime et Timestamp
Convertir le Timestamp
Convertir à partir d'Horodatage date /heure et datetime64
C'est assez facile comme les pandas horodatages sont très puissants
Pour
DatetimeIndex
, letolist
renvoie une liste dedatetime
objets. Pour un seuldatetime64
objet qu'elle renvoie un seuldatetime
objet..item()
qui est beaucoup plus explicite (et personne ne peut venir autour et commencer à discuter qu'il doit renvoyer une liste).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, qui donne une longue (1025222400000000000L
) (!).item()
(suggéré par @seberg),.tolist()
dépend de ce que les unités de datetime64 utilise par exemple,D
produitdatetime.date()
,us
(microsecondes) produiredatetime.datetime()
,ns
(nanosecondes) produirelong
. Et les unités de changer en fonction des valeurs d'entrée par exemple,numpy.datetime64('2012-05-01')
utilise'D'
,numpy.datetime64('2012-05-01T00:00:00.000')
utilisems
,numpy.datetime64('2012-05-01T00:00:00.000000000')
utilisens
. Vous pourriez ouvrir si vous trouvez qu'il est source de confusion.Si vous voulez convertir un ensemble de pandas série de datetimes régulièrement python datetimes, vous pouvez également utiliser
.to_pydatetime()
.Il prend également en charge les fuseaux horaires:
NOTE: Si vous êtes sur un des Pandas de la Série vous ne pouvez pas appeler
to_pydatetime()
sur l'ensemble de la série. Vous aurez besoin de faire appel.to_pydatetime()
sur chaque datetime64 à l'aide d'une compréhension de liste ou quelque chose de similaire:Une option est d'utiliser
str
, puisto_datetime
(ou similaire):Remarque: il n'est pas égal à
dt
parce qu'il est devenu "le décalage de courant":Cela semble peu élégante.
.
Mise à jour: il peut traiter avec le "méchant" exemple:
Ce post a été mis en place depuis 4 ans et j'ai toujours eu du mal avec ce problème de conversion - donc, la question est toujours actif en 2017, dans un certain sens. J'ai été un peu choqué par le fait que la numpy la documentation n'est pas facile de proposer un simple algorithme de conversion, mais c'est une autre histoire.
J'ai trouver une autre façon de faire la conversion qui concerne uniquement les modules
numpy
etdatetime
, il ne nécessite pas de pandas à être importés, ce qui me semble être beaucoup de code à l'importation pour une simple conversion. J'ai remarqué quedatetime64.astype(datetime.datetime)
sera de retour d'unedatetime.datetime
objet si l'originaldatetime64
est dans micro-seconde unités tandis que d'autres unités de renvoyer un nombre entier d'horodatage. J'utilise le modulexarray
pour les données d'e/S de fichiers Netcdf qui utilise ledatetime64
dans l'ordre de la nanoseconde unités faisant la conversion échoue à moins que vous convertissez d'abord à la micro-seconde unités. Voici l'exemple de la conversion de code,Son uniquement testé sur ma machine, qui est Python 3.6 avec une récente 2017 Anaconda de distribution. J'ai seulement regardé scalaire de conversion et n'ont pas vérifié réseau sur la base des conversions bien que j'imagine qu'il sera bon. Je n'ai pas regardé le numpy datetime64 code source pour voir si l'opération a du sens ou pas.
J'ai en revenir à cette réponse plus de fois que je peux compter, j'ai donc décidé de jeter ensemble un peu rapide de classe, qui le convertit en un Numpy
datetime64
valeur de Pythondatetime
valeur. J'espère que cela aidera d'autres.Je vais garder dans mon sac à outils, quelque chose me dit que je vais avoir besoin de lui encore.
ts.to_pydatetime()
en effet, tous ces types datetime peut être difficile, et potentiellement problématiques (doit suivre attentivement informations de fuseau horaire). voici ce que j'ai fait, mais je dois admettre que je suis concerné, au moins une partie de c'est pas "by design". aussi, il peut être un peu plus compact que le nécessaire.
en 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, qui peut être comprimé en une seule ligne si nécessaire.
utilisez cette fonction pour obtenir des pythons natif objet datetime
replace() got an unexpected keyword argument 'tzinfo'
Certaines solutions fonctionnent bien pour moi, mais numpy va déprécier certains paramètres.
La solution qui fonctionne mieux pour moi est de lire la date comme les pandas datetime et excract explicitement l'année, le mois et le jour de pandas objet.
Le code suivant fonctionne pour la situation la plus courante.