Sujet : Re: Python, angles et heures. Datetime ?
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.lang.pythonDate : 14. Nov 2021, 21:30:47
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <87ee7iilg8.fsf@universite-de-strasbourg.fr.invalid>
References : 1
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
Dominique <
zzz@aol.com.invalid> writes:
En astronomie basée sur des éphémérides, l'essentiel des saisies se
fait sous forme d'angles (ddd:mm:ss ou ddd:mm.mm) et d'heures
(hh:mm:ss ou hh:mm.mm)
>
Les heures et les angles sont décimalisés (ddd.ddddd et hh.hhhh) puis,
éventuellement, transformés en notation normalisée (ddd:mm:ss etc).
>
J'ai écrit un script qui contrôle la conformité de la saisie (rejeter
hh/mm/ss par exemple, ou ddd:mmm:ss) Aucun problème aussi pour
décimaliser ces saisies puis les retransformer en notations normales
(hh:mm:ss etc).
>
Existe-t-il toutefois une librairie qui fait ce travail de contrôle de
la saisie et de sa transformation ?
Il y a deux choses dans ta question : 1) vérifier que le texte a la
bonne forme, et 2) le convertir en nombres. Et pour la première, une
question annexe : le nombre de chiffres est-il fixe ? (Autrement dit :
peut-on écrire "1:2.3" pour 1 degré 2 minutes 3 secondes, ou bien
doit-on écrire "001:02.03" ?
Dans tous les cas on peut utiliser des expressions régulières (ou
"rationnelles") pour faire le découpage :
import re
Ensuite, voici une version (pour les degrés) qui permet un nombre
quelconque de chiffres dans chaque partie, convertit, et teste
explicitement les valeurs :
ANGLE = re.compile ("([0-9]+):([0-9]+)[:.]([0-9]+)")
def verif_degres (s):
m = ANGLE.fullmatch (s)
if m is None:
return None
else:
d,m,s = int (m[1]), int (m[2]), int (m[3])
if d < 360 and m < 60 and s < 60:
return d,m,s
else:
return None
Si tu veux exactement 3 chiffres (puis 2 puis 2), il faut le préciser à
la place du "+" :
ANGLE = re.compile ("([0-9]{3}):([0-9]{2})[:.]([0-9]{2})")
On peut aussi vérifier l'intervalle de valeur avec une expression
régulière un peu plus compliquée :
ANGLE_ALT = re.compile ("([0-2][0-9][0-9]|3[0-5][0-9])"
":"
"([0-5][0-9])"
"[:.]"
"([0-5][0-9])")
def verif_degres_alt (s):
m = ANGLE.fullmatch (s)
if m is None:
return None
else:
return (int (m[1]), int (m[2]), int (m[3]))
Mais franchement, je ne suis pas sûr que ça vaille le coup.
Je regarde datetime
(https://docs.python.org/fr/3/library/datetime.html) mais je n'ai pas
l'impression d'y trouver ce que je cherche.
C'est plus adapté au calcul sur les dates et heures (un problème dont la
complexité surprend souvent), pas tellement à la vérification du format
textuel (via strptime), en tout cas pas pour des degrés.
-- Alain.