Python timedelta dans les années
J'ai besoin de vérifier si un certain nombre d'années ont été depuis une certaine date. Actuellement j'ai timedelta
de datetime
module et je ne sais pas comment faire pour le convertir à des années.
- voir cette réponse: stackoverflow.com/a/9754466/65387
- connexes: Comment faire pour convertir des années à la deuxième
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de plus qu'un
timedelta
de dire combien d'années ont passé; vous devez également connaître le début (ou de fin) date d'. (C'est une année bissextile chose).Votre meilleur pari est d'utiliser le
dateutil.relativedelta
objet, mais c'est une 3ème partie du module. Si vous voulez savoir lesdatetime
qui a étén
ans à partir d'une certaine date (par défaut en ce moment), vous pouvez effectuer les opérations suivantes::Si vous préférez vous en tenir avec la bibliothèque standard, la réponse est un peu plus complexe::
Si c'est 2/29, et il y a 18 ans il n'y avait pas 2/29, cette fonction retournera 2/28. Si vous préférez retourner 3/1, il suffit de modifier la dernière
return
déclaration de lire::Votre question à l'origine dit que tu voulais savoir combien d'années il a été depuis une certaine date. En supposant que vous voulez un nombre entier d'années, vous pouvez deviner en fonction de 365.25 jours par an, puis vérifier à l'aide de la
yearsago
fonctions définies ci-dessus::datetime.now()
) est supérieure à la différence entre moyen Julien (365.25
) et Grégorien (365.2425
) ans.. L'approche correcte est suggéré dans @Adam Rosenfield réponseSi vous essayez de vérifier si quelqu'un est de 18 ans, à l'aide de
timedelta
ne fonctionnera pas correctement sur certains cas de bord à cause des années bissextiles. Par exemple, quelqu'un qui est né le 1er janvier 2000, à l'âge de 18 exactement 6575 jours plus tard le 1er janvier 2018 (5 années bissextiles comprises), mais quelqu'un qui est né le 1er janvier 2001, auront 18 ans exactement 6574 jours plus tard le 1er janvier 2019 (4 années bissextiles comprises). Donc, si quelqu'un est exactement 6574 jours, vous ne pouvez pas déterminer si elles sont de 17 ou 18 sans le savoir un petit peu plus d'informations sur leur date de naissance.La bonne façon de le faire est de calculer l'âge directement à partir de la date, en soustrayant les deux ans, puis en soustrayant une si le mois en cours/jour qui précède le mois de naissance/jour.
Tout d'abord, au niveau le plus détaillé, le problème ne peut être résolu exactement. Ans varient en longueur, et il n'y a pas un "bon choix" pour la durée de l'année.
Cela dit, avoir la différence dans ce que les unités sont "naturelles" (probablement secondes) et le diviser par le ratio entre et ans. E. g.
...ou quoi que ce soit. Rester à l'écart de mois, car ils sont moins bien définies que les années.
Voici une mise à jour de la date de naissance de la fonction qui calcule les anniversaires la même façon, les humains n':
Obtenir le nombre de jours, puis diviser par 365.2425 (la moyenne année Grégorienne) pendant des années. Diviser par 30.436875 (la moyenne Grégorien mois) pendant des mois.
Encore une autre 3ème partie de la lib n'est pas mentionné ici est mxDateTime (prédécesseur de python
datetime
et 3ème partietimeutil
) pourrait être utilisé pour cette tâche.Ladite
yearsago
serait:Premier paramètre est supposé être un
DateTime
instance.Pour convertir ordinaire
datetime
àDateTime
vous pouvez l'utiliser pendant 1 seconde précision):ou cette pour 1 microseconde précision:
Et oui, l'ajout de la dépendance de cette unique tâche en question serait certainement un overkill par rapport même avec l'aide de timeutil (suggéré par Rick Copeland).
En fin de compte ce que vous avez est un problème de maths. Si tous les 4 ans, nous avons une journée supplémentaire permet alors plongé le timedelta en jours, et non pas par 365, mais 365*4 + 1, qui vous donnent un montant de 4 ans. Puis la diviser à nouveau par 4.
timedelta /((365*4) +1) /4 = timedelta * 4 /(365*4 +1)
C'est la solution que j'ai travaillé, je l'espère, pourra aider 😉
Comment en avez-vous besoin de l'être?
td.days /365.25
vous obtenez assez proche, si vous êtes inquiet au sujet des années bissextiles.Même si ce fil est déjà mort, pourrais-je vous suggérer une solution pour ce même problème, j'ai été confronté. Ici c'est (la date est une chaîne de caractères dans le format jj-mm-aaaa):
cette fonction retourne la différence en années entre deux dates (pris comme des chaînes de caractères au format ISO, mais il peut facilement modifié pour tenir dans n'importe quel format)
Je vous suggère Pyfdate
la tutoriel
Bien, la question semble plutôt facile.
Vous devez vérifier le nombre de 'plein' années, et seulement si, il est égal à 18 ans ont besoin de s'embêter avec les mois et les jours. Le cas limite est:
endDate.year - startDate.year == 18
et il se fend de deux cas:startDate.month != endDate.month
etstartDate.month == endDate.month
, lorsque vous n'avez qu'à vérifier les jours:C'est encore plus de one-liner-lambda, mais c'est encore assez court, et semble rapide dans l'exécution.