J'ai une énorme liste de dates comme celle-ci sous forme de chaînes:
Jun 1 2005 1:33PM
Aug 28 1999 12:00AM
Je vais les replacer dans des champs datetime appropriés dans une base de données, je dois donc les transformer en objets datetime réels.
Cela passe par l'ORM de Django, donc je ne peux pas utiliser SQL pour effectuer la conversion lors de l'insertion.
strptime()
vous rendra fou, à moins que vous ne l'enveloppiez. Voir ma réponse, basée sur la réponse d'Or Weis à celaRéponses:
datetime.strptime
est la routine principale pour l'analyse des chaînes en temps de données. Il peut gérer toutes sortes de formats, le format étant déterminé par une chaîne de format que vous lui donnez:L'
datetime
objet résultant est naïf de fuseau horaire.Liens:
Documentation Python pour
strptime
: Python 2 , Python 3Documentation Python pour les chaînes
strptime
/strftime
format: Python 2 , Python 3strftime.org est aussi une très belle référence pour strftime
Remarques:
strptime
= "temps d'analyse de chaîne"strftime
= "heure de format de chaîne"la source
date
au lieu d'undatetime
, ledatetime
gérerdatetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
datetime
objet sensible au fuseau horaire en ajoutant cette ligne en Python 3:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
"%Y-%m-%d %H:%M:%S"
from datetime import datetime
au lieu de simplementimport datetime
.Utilisez la bibliothèque de dateutil tierce :
Il peut gérer la plupart des formats de date, y compris celui que vous devez analyser. C'est plus pratique que
strptime
car il peut deviner le bon format la plupart du temps.Il est très utile pour écrire des tests, où la lisibilité est plus importante que les performances.
Vous pouvez l'installer avec:
la source
Découvrez strptime dans le module de temps . C'est l'inverse de strftime .
la source
J'ai mis sur pied un projet qui peut convertir des expressions vraiment soignées. Découvrez l' horodatage .
Voici quelques exemples ci-dessous:
pip install timestring
la source
import timestring
timestring.Date('27 Mar 2014 12:32:29 GMT').year
Cette bibliothèque l'a rendu si facile! Je vous remercie.2017-02-01
. Idem pour le 5 / février / 2017 (il fait correctement le 5 février / 2017, cependant); aucun de ces deux derniers n'est un format que j'ai jamais vu utilisé à ma connaissance, mais j'ai pensé que je le ferais remarquer quand même.Date("20180912")
analyse en quelque sorte une valeur de2018-11-21
. À utiliser à vos risques et périls.N'oubliez pas ceci et vous n'avez plus besoin de vous perdre dans la conversion datetime.
Chaîne en objet datetime =
strptime
objet datetime vers d'autres formats =
strftime
Jun 1 2005 1:33PM
est égal à
%b %d %Y %I:%M%p
vous avez donc besoin de strptime c'est-
string
à- dire la conversion enProduction
Et si vous avez différents formats de dates, vous pouvez utiliser panda ou dateutil.parse
Production
la source
%b
cassera pas si vous analysez une date en anglais sur une machine qui n'a pas de paramètres régionaux en anglais?En Python> = 3.7.0,
pour convertir la chaîne AAAA-MM-JJ en objet datetime ,
datetime.fromisoformat
pourrait être utilisé.la source
De nombreux horodatages ont un fuseau horaire implicite. Pour vous assurer que votre code fonctionnera dans chaque fuseau horaire, vous devez utiliser UTC en interne et attacher un fuseau horaire chaque fois qu'un objet étranger pénètre dans le système.
Python 3.2+:
la source
mktime()
1ère méthode laide et parfois erronée ( pendant les transitions DST) si vous connaissez la 2ème méthode (datetime.strptime()
)? Si vous voulez éviter une exception pendant une secondecalendar.timegm
(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
Voici deux solutions utilisant Pandas pour convertir des dates formatées sous forme de chaînes en objets datetime.date.
Timings
Et voici comment convertir les exemples de date-heure d'origine de l'OP:
Il existe de nombreuses options pour la conversion des chaînes en horodatages Pandas à l'aide
to_datetime
, alors vérifiez les documents si vous avez besoin de quelque chose de spécial.De même, les horodatages ont de nombreuses propriétés et méthodes accessibles en plus de
.date
la source
Personnellement, j'aime la solution utilisant le
parser
module, qui est la deuxième réponse à cette question et est magnifique, car vous n'avez pas à construire de littéraux de chaîne pour le faire fonctionner. MAIS , un inconvénient est qu'il est 90% plus lent que la réponse acceptéestrptime
.Tant que vous ne le faites pas un million de fois, je pense toujours que la
parser
méthode est plus pratique et gérera la plupart des formats de temps automatiquement.la source
Quelque chose qui n'est pas mentionné ici et qui est utile: ajouter un suffixe à la journée. J'ai découplé la logique du suffixe afin que vous puissiez l'utiliser pour n'importe quel nombre que vous aimez, pas seulement pour les dates.
la source
la source
Exemple d'objet datetime compatible avec Django Timezone.
Cette conversion est très importante pour Django et Python lorsque vous avez
USE_TZ = True
:la source
Créez une petite fonction utilitaire comme:
C'est assez polyvalent:
la source
format
est un mot réservé en python et ne doit pas être utilisé comme nom de variable.Il serait utile pour convertir la chaîne en datetime et également avec le fuseau horaire
la source
la flèche offre de nombreuses fonctions utiles pour les dates et les heures. Ce morceau de code fournit une réponse à la question et montre que la flèche est également capable de formater facilement les dates et d'afficher des informations pour d'autres paramètres régionaux.
Voir http://arrow.readthedocs.io/en/latest/ pour en savoir plus.
la source
Vous pouvez utiliser easy_date pour simplifier:
la source
Si vous ne voulez que le format de date, vous pouvez le convertir manuellement en passant vos champs individuels comme:
Vous pouvez passer vos valeurs de chaîne fractionnées pour les convertir en type de date comme:
Vous obtiendrez la valeur résultante au format date.
la source
Vous pouvez également vérifier
dateparser
Installer:
C'est, je pense, la façon la plus simple d'analyser les dates.
Exemple de code:
Production:
la source
Voir ma réponse .
Dans les données du monde réel, c'est un vrai problème: plusieurs formats de date, incompatibles, incomplets, incohérents et multilingues / région, souvent mélangés librement dans un seul ensemble de données. Ce n'est pas ok pour le code de production d'échouer, et encore moins de faire exception comme un renard.
Nous devons essayer ... attraper plusieurs formats datetime fmt1, fmt2, ..., fmtn et supprimer / gérer les exceptions (de
strptime()
) pour tous ceux qui ne correspondent pas (et en particulier, éviter d'avoir besoin d'une échelle indentée yukky n-deep d'essayer ..catch clauses). De ma solutionla source
il affiche la colonne "Date de début" et la "Dernière heure de connexion" sont toutes deux "objet = chaînes" dans la trame de données
En utilisant l'
parse_dates
optionread_csv
mentionnée, vous pouvez convertir votre chaîne datetime au format pandas datetime.la source