Calculer l'age

Le
ReM
Bonjour,

Je souhaite calculer l'age d'une personne avec un affichage conditionnel
en fonction de celui ci.
si age < 3 mois on affiche le nombre de jours
si age < 1 an on affiche le nombre de mois
sinon on affiche l'age en année.

Voici ma fonction mais elle ne couvre pas tous les cas

import datetime

# date au format JJ/MM/AAAA
#CreateDateObject crée un objet datetime
def CalculerAgeEtLibelle( date, ref_date = Today() ):
age = ""
if date:
dn = CreateDateObject( date )
rd = CreateDateObject( ref_date )

diff = rd - dn
nb_jours = diff.days

if nb_jours < 90:
age = str(nb_jours) + " jour"
if nb_jours != 1:
age += "s"
elif diff.days < 365:
age = str(int( nb_jours / 30 )) + " mois"
else:
annee = int( nb_jours / 365.25 )
age = str(annee) + " an"
if annee != 1:
age += "s"

return age

def CreateDateObject(maDate):
(ji, mi, ai) = GetComposantDate(maDate)
oDate = datetime.datetime(ai,mi,ji)
return oDate

def GetComposantDate(maDate):
ji = int(maDate[0:2])
mi = int(maDate[3:5])
ai = int(maDate[6:10])
return (ji,mi,ai)

def Today():
( year, month, day, hour, min, sec, weekday, julianday, dummy ) =
localtime()
return "%02d/%02d/%04d" %( day, month, year )


Si aujourd'hui == 18/07/2007
Ne marche pas pour date de naissance le 18/04/2007, la fonction devrait
me retourner 3 mois et non 90 jours.
Idem, je risque de rencontrer des soucis avec les années bissextiles.

Je n'ai rien trouvé dans les module datetime, si vous avez une idée,
merci !!!

ReM
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Baptiste renard
Le #633552
ReM wrote:

Bonjour,

Je souhaite calculer l'age d'une personne avec un affichage conditionnel
en fonction de celui ci.
si age < 3 mois on affiche le nombre de jours
si age < 1 an on affiche le nombre de mois
sinon on affiche l'age en année.

Voici ma fonction mais elle ne couvre pas tous les cas
[SNIP]
Si aujourd'hui == 18/07/2007
Ne marche pas pour date de naissance le 18/04/2007, la fonction devrait
me retourner 3 mois et non 90 jours.
Idem, je risque de rencontrer des soucis avec les années bissextiles.


Ton script me parait correct. il fonctionne chez moi. (modulo 2/3
corrections)

Juste le if nb_jours != 1: pose problème. en effet, si tu est né
aujourd'hui, il te note 0 jours.

32 ans
3 mois
0 jours


import datetime
from time import localtime
def Today():
( year, month, day, hour, min, sec, weekday, julianday, dummy ) localtime()
return "%02d/%02d/%04d" %( day, month, year )

# date au format JJ/MM/AAAA
#CreateDateObject cree un objet datetime
def CalculerAgeEtLibelle( date, ref_date = Today() ):
age = ""
if date:
dn = CreateDateObject( date )
rd = CreateDateObject( ref_date )

diff = rd - dn
nb_jours = diff.days

if nb_jours < 90:
age = str(nb_jours) + " jour"
if nb_jours > 1:
age += "s"
elif diff.days < 365:
age = str(int( nb_jours / 30 )) + " mois"
else:
annee = int( nb_jours / 365.25 )
age = str(annee) + " an"
if annee != 1:
age += "s"

return age

def CreateDateObject(maDate):
(ji, mi, ai) = GetComposantDate(maDate)
oDate = datetime.datetime(ai,mi,ji)
return oDate

def GetComposantDate(maDate):
ji = int(maDate[0:2])
mi = int(maDate[3:5])
ai = int(maDate[6:10])
return (ji,mi,ai)

print CalculerAgeEtLibelle("05/08/1974","18/07/2007")
print CalculerAgeEtLibelle("18/04/2007","18/07/2007")
print CalculerAgeEtLibelle(Today())

Pierre Quentel
Le #633350
Bonjour,

Il vaut mieux calculer à partir des jours, mois et années des deux
dates plutôt que sur la différence entre les deux dates (instance de
datetime.timedelta) : c'est très difficile à partir des jours de
retrouver des jours / mois / ans (une période de 3 mois peut aller de
89 à 92 jours sauf erreur)

Le jour courant est donné par datetime.date.today()
La méthode strftime() définit la représentation d'une date sous forme
de chaîne

Je propose ceci :

def CalculerAgeEtLibelle(naissance_str,
ref_date_strÚtetime.date.today().strftime("%d/%m/%Y")):

"""les parametres sont des chaines de caracteres representant
la date de naissance et une date de reference, par defaut
aujourd'hui"""

# instance de datetime.date pour naissance
jour,mois,an = [ int(x) for x in naissance_str.split("/") ]
naissance = datetime.date(an,mois,jour)

# instance de datetime.date pour date ref
j,m,a = [ int(x) for x in ref_date_str.split("/") ]
ref_date = datetime.date(a,m,j)

# date des 3 mois
date_3_mois = datetime.date(an+(mois+3)/12,(mois+3)%12,jour)
# date du 1er anniversaire
date_1_an = datetime.date(an+1,mois,jour)

# on traite les differents cas
if ref_date < date_3_mois:
age_jours = ref_date-naissance # instance de timedelta
if age_jours.days > 1:
return "%s jours" %age_jours
else:
return "1 jour"
elif ref_date<date_1_an:
# age en mois
delta_mois = (ref_date.month-naissance.month) +
12*(ref_date.year-naissance.year)
# correctif en fonction du jour dans le mois
correctif = int(ref_date.day<naissance.day)
return "%s mois" %(delta_mois - correctif)
else:
# age en annees
delta_ans = ref_date.year-naissance.year
# correctif si la date de l'anniversaire n'est pas atteinte
anniv = datetime.date(naissance.year
+delta_ans,naissance.month,naissance.day)
correctif = int(anniv>ref_date) # 1 si anniversaire non
atteint, 0 sinon
age_ans = delta_ans - correctif
if age_ans > 1:
return "%s ans" %age_ans
else:
return "1 an"

A+
Pierre
Publicité
Poster une réponse
Anonyme