Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Écart entre deux dates.

5 réponses
Avatar
Dominique
Bonjour,

Dans Linux référence spécial Python, il est proposé des exercices que je
fais.

Il nous est demandé de calculer l'écart entre deux dates en utilisant
dateutil.

J'ai écrit ces quelques lignes, mais je les trouve compliquées et peu
élégantes. Je n'ai rien trouvé de probant dans la bibliothèque dateutil :

from dateutil import parser
date1=parser.parse('2022-06-10')
date2=parser.parse('2022-01-01')
print((date1-date2).days)
160

Est-il possible de l'améliorer ? De plus, je ne vois pas très bien Í 
quoi correspond la fonction parser (et parse dans la foulée...)

L'aide (help('parser')) ne m'éclaire pas beaucoup...

J'ai évité astropy avec les calculs de jours juliens. Ça aurait ajouté
de la complication, je pense.

En vous remerciant,

Dominique

5 réponses

Avatar
Nicolas
Bonjour,
Le 22/05/2022 Í  16:15, Dominique a écrit :
Bonjour,
Dans Linux référence spécial Python, il est proposé des exercices que je
fais.
Il nous est demandé de calculer l'écart entre deux dates en utilisant
dateutil.
J'ai écrit ces quelques lignes, mais je les trouve compliquées et peu
élégantes. Je n'ai rien trouvé de probant dans la bibliothèque dateutil :
from dateutil import parser
date1=parser.parse('2022-06-10')
date2=parser.parse('2022-01-01')
print((date1-date2).days)
160
Est-il possible de l'améliorer ? De plus, je ne vois pas très bien Í 
quoi correspond la fonction parser (et parse dans la foulée...)

Je ne suis pas allé voir la documentation, mais visiblement, la fonction
parser.parse() convertit une chaine de caractères en date (au format
utilisé par dateutil).
L'aide (help('parser')) ne m'éclaire pas beaucoup...

help('parser') (avec des cotes) renvoie l'aide d'une fonctionnalité
interne de Python :
help('parser')



Help on built-in module parser:
NAME
parser - This is an interface to Python's internal parser.
La bonne syntaxe est sans les cotes :
help(parser)
J'ai évité astropy avec les calculs de jours juliens. Ça aurait ajouté
de la complication, je pense.

A noter que la bibliothèque standard de Python permet de manipuler du
temps et des dates :
import datetime
dt1 = datetime.datetime.now()
dt2 = datetime.datetime.now()
dt2 - dt1



datetime.timedelta(0, 5, 799467)
d1 = datetime.datetime.now().date()
d2 = datetime.datetime.now().date()
d2 - d1



datetime.timedelta(0)
t1 = datetime.datetime.now().time()
t2 = datetime.datetime.now().time()
t2 -t1



Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'datetime.time' and
'datetime.time'
De façon surprenante, la différence sur des temps n'est pas implémentée.
Nicolas
En vous remerciant,
Dominique
Avatar
Damien Wyart
* Nicolas in fr.comp.lang.python:
t1 = datetime.datetime.now().time()
t2 = datetime.datetime.now().time()
t2 -t1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'datetime.time' and
'datetime.time'
De façon surprenante, la différence sur des temps n'est pas implémentée.

Pour un horaire sans date associée, je pense que le risque d'erreur ou
d'ambiguͯté serait trop important : comment traiter le delta entre 11pm
et 1am -> il dépend s'ils sont le même jour ou non... De même, les
datetime.time sont vus comme des horaires et non des durées, et donc les
ajouter n'a pas vraiment de sens (et donc les soustraire non plus, par
cohérence).
--
DW
Avatar
Damien Wyart
* Dominique in fr.comp.lang.python:
Il nous est demandé de calculer l'écart entre deux dates en utilisant
dateutil.
J'ai écrit ces quelques lignes, mais je les trouve compliquées et peu
élégantes. Je n'ai rien trouvé de probant dans la bibliothèque
dateutil :
from dateutil import parser
date1=parser.parse('2022-06-10')
date2=parser.parse('2022-01-01')
print((date1-date2).days)
160
Est-il possible de l'améliorer ? De plus, je ne vois pas très bien Í 
quoi correspond la fonction parser (et parse dans la foulée...)

Comme indiqué par Nicolas, parse permet d'analyser une chaÍ®ne pour en
extraire un object DataTime. La bibliothèque standard permet déjÍ  de le
faire mais de manière moins souple et avec moins de support de formats
multiples. parser n'est pas une fonction mais permet juste de "ranger"
les différents noms dans le module dateutil. En arrière-plan, il
correspond aussi Í  une classe Parser, interne au module.
Comme Nicolas l'a également proposé, on peut très bien tout faire en
Python standard (je montre deux façons de créer des DateTime) :
from datetime import date
d1 = date.fromisoformat('2022-06-10')
d2 = date(2022, 1, 1)
print(d1-d2)
-> donne "160 days, 0:00:00"
pour cet exercice, plus que parse, c'est peut-être relativedelta, du
module dateutil, qui est pertinent :
from dateutil.relativedelta import relativedelta
print(relativedelta(d1, d2))
-> donne "relativedelta(months=+5, days=+9)" qui est peut-être plus
facile Í  appréhender pour un humain :)
--
DW
Avatar
Nicolas
Le 23/05/2022 Í  12:29, Damien Wyart a écrit :
* Nicolas in fr.comp.lang.python:
t1 = datetime.datetime.now().time()
t2 = datetime.datetime.now().time()
t2 -t1



Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'datetime.time' and
'datetime.time'

De façon surprenante, la différence sur des temps n'est pas implémentée.

Pour un horaire sans date associée, je pense que le risque d'erreur ou
d'ambiguͯté serait trop important : comment traiter le delta entre 11pm
et 1am -> il dépend s'ils sont le même jour ou non... De même, les
datetime.time sont vus comme des horaires et non des durées, et donc les
ajouter n'a pas vraiment de sens (et donc les soustraire non plus, par
cohérence).

Bonne remarque :)
Avatar
Dominique
Le 23/05/2022 Í  13:44, Damien Wyart a écrit :
Comme indiqué par Nicolas, parse permet d'analyser une chaÍ®ne pour en
extraire un object DataTime. La bibliothèque standard permet déjÍ  de le
faire mais de manière moins souple et avec moins de support de formats
multiples. parser n'est pas une fonction mais permet juste de "ranger"
les différents noms dans le module dateutil. En arrière-plan, il
correspond aussi Í  une classe Parser, interne au module.

OK, je comprends mieux parse qui est une fonction de dateutil.
Comme Nicolas l'a également proposé, on peut très bien tout faire en
Python standard (je montre deux façons de créer des DateTime) :
from datetime import date
d1 = date.fromisoformat('2022-06-10')
d2 = date(2022, 1, 1)
print(d1-d2)
-> donne "160 days, 0:00:00"
pour cet exercice, plus que parse, c'est peut-être relativedelta, du
module dateutil, qui est pertinent :
from dateutil.relativedelta import relativedelta
print(relativedelta(d1, d2))
-> donne "relativedelta(months=+5, days=+9)" qui est peut-être plus
facile Í  appréhender pour un humain :)

Je vous remercie tous pour vos précisions et les options que vous me
proposez. Je suis toujours étonné par la richesse de Python :-)
Bonne fin de journée,
Dominique