Bonjour tout le monde,
Je cherche à gérer des dates qui sont parfois imprécises (par exemple, seulement l’année, ou l’année + le mois).
Jusqu’à présent, j’utilisais des colonnes de type Date avec un format personnalisé (YYYY). Cela permet d’afficher uniquement l’année, mais la valeur stockée reste une date complète (souvent le 1er janvier, ou le 1er du mois).
J’aimerais conserver le type Date, tout en ne stockant que l’information réellement connue (année ou mois), sans introduire artificiellement un jour par défaut qui fausse la donnée, (notamment dans mes formules après).
Le passage en texte est possible, mais j’utilise ces valeurs dans des formules (notamment pour des calculs d’intervalles), ce qui rend le format Date préférable.
Avez-vous déjà rencontré ce cas ? Quelles solutions recommandez-vous ?
Merci pour vos retours.
3 « J'aime »
Bonjour,
ça me parait compliqué mais si cela est possible je suis également intéressé par la solution !
Bonjour, ce n’est pas possible
Comment faites-vous pour calculer un intervalle entre deux dates sans connaître explicitement les deux dates ?
Bonjour,
Actuellement, lors de mes calculs d’intervalle, ceux-ci se font normalement avec une date complète. Cependant, cette date est erronée puisque, automatiquement, un jour est rempli (le premier du mois ou de l’année).
value or [hq.city for hq in (rec.publisher.hq_city_date or [])
if rec.publication_year
and hq.start_date
and hq.start_date <= rec.publication_year
and (not hq.end_date or rec.publication_year <= hq.end_date)
and hq.city]
Sinon, je suis actuellement en train de faire des tests pour forcer, dans les formules, que la comparaison se fasse uniquement sur l’année avec publication_year.year. Cependant, il me parait beaucoup plus sûr que la donnée soit correctement stockée dès le départ, afin que ce ne soient pas les formules qui la transforment et pour éviter les erreurs. C’est donc ce que j’essaie actuellement de faire.
Bonjour, si jamais cela est utile à quelqu’un d’autre faisant face à ce problème, voilà le code m’ayant servi de solution, avec des dates qui sont dans des colonnes textes :
conversion des dates en intervalles
def to_interval(x):
if not x:
return None
x = str(x)
# gestion des années
if len(x) == 4:
return ("01/01/" + x, "31/12/" + x)
parts = x.split("/")
# gestion des mois
if len(parts) == 2:
m, y = parts
# approximation fin de mois
if m in ["01","03","05","07","08","10","12"]:
last = "31"
elif m in ["04","06","09","11"]:
last = "30"
else:
last = "28"
return ("01/" + m + "/" + y, last + "/" + m + "/" + y)
#gestion des dates préçises
else :
return (x, x)
# comparaison intervalle
def interval_ok(start, pub, end):
if not start or not pub:
return False
s1, s2 = start
p1, p2 = pub
if end:
e1, e2 = end
return (s1 <= p2) and (p1 <= e2)
return s1 <= p2