Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Écart entre deux dates.

52 views
Skip to first unread message

Dominique

unread,
May 22, 2022, 10:15:30 AM5/22/22
to
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

Nicolas

unread,
May 23, 2022, 4:23:08 AM5/23/22
to
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

Damien Wyart

unread,
May 23, 2022, 6:29:04 AM5/23/22
to
* Nicolas <nico...@aaton.com> 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

Damien Wyart

unread,
May 23, 2022, 7:44:15 AM5/23/22
to
* Dominique <z...@aol.com.invalid> 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

Nicolas

unread,
May 23, 2022, 7:44:50 AM5/23/22
to
Bonne remarque :)

Dominique

unread,
May 23, 2022, 12:35:06 PM5/23/22
to
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

0 new messages