Discussion:
Curiosité avec datetime
(trop ancien pour répondre)
Dominique
2024-04-08 15:54:16 UTC
Permalink
Bonjour,

Je découvre datetime. Je suis étonné par le traitement de l'entrée en
vigueur du calendrier grégorien. Mon script est très simple :

print('Nombre de jours entre deux dates')
t=input('Date de départ de la forme jj-mm-aaaa hh:mm:ss ')
t1=input('Date d\'arrivée de la forme jj-mm-aaaa hh:mm:ss ')

match='%d-%m-%Y %H:%M:%S'
tc=datetime.strptime(t,match)
tc1=datetime.strptime(t1,match)
print(tc1-tc)

et la sortie :

Nombre de jours entre deux dates
Date de départ de la forme jj-mm-aaaa hh:mm:ss 4-10-1582 0:0:0
Date d'arrivée de la forme jj-mm-aaaa hh:mm:ss 15-10-1582 0:0:0
11 days, 0:00:00

Il ne devrait y avoir qu'un unique jour entre les deux dates. Datetime
serait incapable de traiter le changement de calendrier ? Je suppose que
oui, à la lecture de la documentation
(https://docs.python.org/3/library/datetime.html) :

class datetime.date
An idealized naive date, assuming the current Gregorian calendar always
was, and always will be, in effect.

Bon, soit. Je tente avec Time de astropy. Même résultat :

Le 4 / 10 / 1582 à 0 h 0 correspond au jour julien (JD) : 2299149.5
Ainsi qu'au jour julien modifié (MJD) -100851.0

et

Le 15 / 10 / 1582 à 0 h 0 correspond au jour julien (JD) : 2299160.5
Ainsi qu'au jour julien modifié (MJD) -100840.0

J'ai toujours, à tort, 11 jours d'écart.

Mon analyse est-elle bonne, à savoir que tant datetime que astropy
traitent mal ce changement de calendrier ? Pour être franc, j'ai un peu
de mal à le croire et je tends à penser que je dois me tromper, mais où... ?

Merci et belle fin de journée,
--
Dominique
Esto quod es
yves
2024-04-08 16:31:52 UTC
Permalink
Post by Dominique
Mon analyse est-elle bonne, à savoir que tant datetime que astropy
traitent mal ce changement de calendrier ? Pour être franc, j'ai un peu
de mal à le croire et je tends à penser que je dois me tromper, mais où... ?
Ce que je comprends de la phrase de la documentation que tu as citée :

class datetime.date
An idealized naive date, assuming the current Gregorian calendar always
was, and always will be, in effect.

c'est que datetime ne traite pas du tout ce changement de calendrier. Le
module assume que le calendrier Gregorien a toujours été en vigueur.

Ce qui n'est pas surprenant à la lecture de la page Wikipédia :

<https://fr.wikipedia.org/wiki/
Passage_du_calendrier_julien_au_calendrier_gr%C3%A9gorien>

En résumé, la page explique que la date de changement de calendrier a été
variable selon les endroits.

@+
--
Yves
Dominique
2024-04-09 01:15:40 UTC
Permalink
Post by yves
c'est que datetime ne traite pas du tout ce changement de calendrier. Le
module assume que le calendrier Gregorien a toujours été en vigueur.
<https://fr.wikipedia.org/wiki/
Passage_du_calendrier_julien_au_calendrier_gr%C3%A9gorien>
En résumé, la page explique que la date de changement de calendrier a été
variable selon les endroits.
Bonjour Yves,

Oui, l'application du calendrier grégorien s'est étalée dans le temps.
Je crois que le dernier pays à l'avoir adopté est la Russie en 1917. Je
suis toutefois étonné que datetime tout comme astropy ne tiennent pas
compte de ce changement de calendrier.

Avec un script un peu plus « rustique » écrit à partir de « Calculs
astronomiques à l'usage des amateurs » de Jean Meeus, l'écart de 1 jour
s'obtient bien :

-------------------------------------------------------------
j=int(input("Jour "))
m=int(input("Mois "))
y=int(input("Année "))

def julien(y,m,d,b):
jj=int(365.25*y)+int(30.6001*(m+1))+d+1720994.5+b
return jj


mois=m
annee=y

heure=int(input("Heure "))
minutes=float(input("Minutes "))

d=j+(heure+minutes/60)/24

temps=y+m/100+j/10000

a=int(y/100) ##calculs (a et b) intermédiaires pour tenir compte du
changement de calendrier
b=2-a+int(a/4)


if temps<1582.1015: ##la date cherchée est-elle antérieure au 15/10/1582
b=0 ##neutralisation de b si nous sommes dans le calendrier julien

if m<3:
y-=1
m+=12
jule=julien(y,m,d,b)

print ("Le ",j,"/",mois,"/",annee,"à ",heure,"h",minutes," correspond au
jour julien : ",round(jule,4))

-------------------------------------------------------------
J'obtiens les bons résultats :
Le 4 / 10 / 1582 à 0 h 0 correspond au jour julien : 2299159.5
Le 15 / 10 / 1582 à 0 h 0 correspond au jour julien : 2299160.5

La différence est bien d'un jour.

Bonne journée,
--
Dominique
Esto quod es
yves
2024-04-09 14:14:37 UTC
Permalink
Post by Dominique
Mon analyse est-elle bonne, à savoir que tant datetime que astropy
traitent mal ce changement de calendrier ? Pour être franc, j'ai un peu
de mal à le croire et je tends à penser que je dois me tromper, mais où... ?
Je ne connais pas astropy, mais je pense que l'on doit pouvoir préciser
que la date que l'on saisit est une date du calendrier Julien.

Depuis ton message, je me pose la question de savoir si la date de la
bataille de Marignan, qui commence le 13 septembre 1515 (<https://
fr.wikipedia.org/wiki/Bataille_de_Marignan>), est une date exprimée dans
le calendrier Grégorien, ou une date exprimée dans le calendrier Julien.

Je pense qu'il s'agit d'une date recalculée suivant le calendrier
Grégorien.

Je fais suivre sur fr.soc.histoire, malgré tout.

@+
--
Yves
Continuer la lecture sur narkive:
Loading...