J'utilise pandas.to_datetime
pour analyser les dates dans mes données. Les pandas par défaut représentent les dates avec datetime64[ns]
même si les dates sont uniquement quotidiennes. Je me demande s'il existe un moyen élégant / intelligent de convertir les dates en datetime.date
ou de datetime64[D]
sorte que, lorsque j'écris les données au format CSV, les dates ne soient pas ajoutées 00:00:00
. Je sais que je peux convertir le type manuellement élément par élément:
[dt.to_datetime().date() for dt in df.dates]
Mais c'est vraiment lent car j'ai beaucoup de lignes et cela défait en quelque sorte le but de l'utilisation pandas.to_datetime
. Existe-t-il un moyen de convertir simultanément dtype
la totalité de la colonne? Ou bien, prend-il en pandas.to_datetime
charge une spécification de précision afin que je puisse me débarrasser de la partie temporelle tout en travaillant avec des données quotidiennes?
df.dates.apply(lambda x: x.date())
devrait être au moins un peu plus rapide. jetez également un œil à github.com/pydata/pandas/issues/2583Réponses:
Depuis la version,
0.15.0
cela peut maintenant être fait facilement en utilisant.dt
pour accéder uniquement au composant date:Ce qui précède renvoie un
datetime.date
dtype, si vous voulez en avoir un,datetime64
vous pouvez simplementnormalize
le composant time à minuit afin qu'il définit toutes les valeurs à00:00:00
:Cela conserve le dtype
datetime64
mais l'affichage n'affiche que ladate
valeur.la source
Solution simple:
la source
Alors que j'ai surévalué la réponse d'EdChum, qui est la réponse la plus directe à la question posée par l'OP, elle ne résout pas vraiment le problème de performance (elle repose toujours sur des
datetime
objets python , et donc toute opération sur eux ne sera pas vectorisée - c'est-à-dire qu'elle sera lent).Une alternative plus performante consiste à utiliser
df['dates'].dt.floor('d')
. À strictement parler, il ne "conserve que la partie date", car il ne fait que régler l'heure00:00:00
. Mais cela fonctionne comme souhaité par l'OP lorsque, par exemple:groupby
... et c'est beaucoup plus efficace, puisque l'opération est vectorisée.
EDIT: en fait, la réponse que les PO auraient préféré est probablement "les versions récentes de
pandas
n'écrivent pas l'heure en csv si c'est00:00:00
pour toutes les observations".la source
to_json
écrit toujours le plein00:00:00
.date_format='iso'
?! Par défaut, il ne sort que quelques secondes depuis l'époque.dt.normalize()
sur des séries de plus de quelques centaines d'éléments.Pandas
DatetimeIndex
etSeries
ont une méthode appeléenormalize
qui fait exactement ce que vous voulez.Vous pouvez en savoir plus à ce sujet dans cette réponse .
Il peut être utilisé comme
ser.dt.normalize()
la source
Pandas v0.13 +: utiliser
to_csv
avec ledate_format
paramètreÉvitez, dans la mesure du possible, de convertir votre
datetime64[ns]
série en uneobject
série d'datetime.date
objets dtype . Ce dernier, souvent construit en utilisantpd.Series.dt.date
, est stocké sous forme de tableau de pointeurs et est inefficace par rapport à une série basée sur NumPy pur.Puisque votre souci est le format lors de l'écriture en CSV , utilisez simplement le
date_format
paramètre deto_csv
. Par exemple:Voir les
strftime
directives de Python pour les conventions de formatage.la source
C'est un moyen simple d'extraire la date:
la source
Conversion en
datetime64[D]
:Bien que réaffecter cela à un col DataFrame le ramènera à [ns].
Si vous vouliez du réel
datetime.date
:la source
dt
, ce snipet de réponse écrasera ce module! @ Dale-Jung, pourrait peut-être changer la ligne en quelque chose comme dt_indexdf.loc[date]
méthode, l'index reviendra à un horodatage, ce qui signifie que les comparaisons ultérieures ne fonctionneront plusJe donne juste une réponse plus à jour au cas où quelqu'un verrait ce vieux message.
L'ajout de "utc = False" lors de la conversion en datetime supprimera le composant de fuseau horaire et ne conservera que la date dans un type de données datetime64 [ns].
Vous pourrez l'enregistrer dans Excel sans obtenir l'erreur "ValueError: Excel ne prend pas en charge les heures avec des fuseaux horaires. Veuillez vous assurer que les heures ne sont pas au fuseau horaire avant d'écrire dans Excel."
la source
Je voulais pouvoir changer le type d'un ensemble de colonnes dans un bloc de données, puis supprimer l'heure en gardant la journée. rond (), sol (), plafond () tous travaux
la source