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 ?
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.
Merci et bon après-midi,
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Alain Ketterlin
Dominique 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.
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 "+" :
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.
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.
Dominique
Le 14/11/2021 Í 20:30, Alain Ketterlin a écrit :
Dominique writes: 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.
Bonjour Alain, Je te remercie pour ce retour très précis et qui... me conforte dans l'analyse que j'avais faite de ce problème. Je m'étais tourné vers les REGEX et avais écrit deux motifs : modele1='[0-9]{1,3}[:][0-9]{1,2}[.][0-9]{1,}' modele2='[0-9]{1,3}[:][0-9]{1,2}[:][0-9]{2}' o͹ je réglais la question du nombre de caractères avec {1,3} et {1,2} pour les minutes et secondes (Merci les REGEX de LibreOffice !) ainsi que de la décimalisation des minutes (mm.mm) classique en navigation astronomique. Je pensais renforcer mon script avec tes lignes : if d < 360 and m < 60 and s < 60: return d,m,s else: return None mais il me faudrait distinguer les heures (maxi 24) des angles... Placer un modulo derrière demanderait de distinguer l'un de l'autre... Le modulo interviendra dans le travail au-delÍ . Ce que j'ignore, c'est le comportement de re.compile... À quoi sert-il ? Bonne journée, -- Dominique Courriel : dominique point sextant ate orange en France Esto quod es
Le 14/11/2021 Í 20:30, Alain Ketterlin a écrit :
Dominique <zzz@aol.com.invalid> writes:
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 "+" :
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.
Bonjour Alain,
Je te remercie pour ce retour très précis et qui... me conforte dans
l'analyse que j'avais faite de ce problème. Je m'étais tourné vers les
REGEX et avais écrit deux motifs :
o͹ je réglais la question du nombre de caractères avec {1,3} et {1,2}
pour les minutes et secondes (Merci les REGEX de LibreOffice !) ainsi
que de la décimalisation des minutes (mm.mm) classique en navigation
astronomique.
Je pensais renforcer mon script avec tes lignes :
if d < 360 and m < 60 and s < 60:
return d,m,s
else:
return None
mais il me faudrait distinguer les heures (maxi 24) des angles... Placer
un modulo derrière demanderait de distinguer l'un de l'autre... Le
modulo interviendra dans le travail au-delÍ .
Ce que j'ignore, c'est le comportement de re.compile... À quoi sert-il ?
Bonne journée,
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Dominique writes: 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.
Bonjour Alain, Je te remercie pour ce retour très précis et qui... me conforte dans l'analyse que j'avais faite de ce problème. Je m'étais tourné vers les REGEX et avais écrit deux motifs : modele1='[0-9]{1,3}[:][0-9]{1,2}[.][0-9]{1,}' modele2='[0-9]{1,3}[:][0-9]{1,2}[:][0-9]{2}' o͹ je réglais la question du nombre de caractères avec {1,3} et {1,2} pour les minutes et secondes (Merci les REGEX de LibreOffice !) ainsi que de la décimalisation des minutes (mm.mm) classique en navigation astronomique. Je pensais renforcer mon script avec tes lignes : if d < 360 and m < 60 and s < 60: return d,m,s else: return None mais il me faudrait distinguer les heures (maxi 24) des angles... Placer un modulo derrière demanderait de distinguer l'un de l'autre... Le modulo interviendra dans le travail au-delÍ . Ce que j'ignore, c'est le comportement de re.compile... À quoi sert-il ? Bonne journée, -- Dominique Courriel : dominique point sextant ate orange en France Esto quod es
Damien Wyart
* Dominique in fr.comp.lang.python:
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)
Peut-être regarder Astropy (je ne connais pas en détail) : https://docs.astropy.org/en/stable/index.html -- DW
* Dominique <zzz@aol.com.invalid> in fr.comp.lang.python:
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)
Peut-être regarder Astropy (je ne connais pas en détail) :
https://docs.astropy.org/en/stable/index.html
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)
Peut-être regarder Astropy (je ne connais pas en détail) : https://docs.astropy.org/en/stable/index.html -- DW
Alain Ketterlin
Olivier Miakinen <om+ writes:
Le gain de temps d'exécution en cas de réutilisation est en général substantiel. D'ailleurs, c'est tellement vrai que le module re le fait tout seul maintenant (il garde en mémoire les dernières expressions régulières avec leur automate, pour éviter d'avoir Í refaire la première étape).
Oh ! Je ne savais pas ça. C'est très malin.
C'est officiel apparemment, puisque ça apparaÍ®t dans la doc de re.compile(), Í https://docs.python.org/3/library/re.html#re.compile | Note: The compiled versions of the most recent patterns passed to | re.compile() and the module-level matching functions are cached, so | programs that use only a few regular expressions at a time needn’t | worry about compiling regular expressions. On attendra pour savoir ce que signifie "a few"... (Pour les dinosaures et assimilés, c'est une technique ancienne qu'on appelle "mémoͯsation" -- sans r, et avec un z et sans accent aigu ni tréma en Anglais.) -- Alain.
Olivier Miakinen <om+news@miakinen.net> writes:
Le gain de temps d'exécution en cas de réutilisation est en général
substantiel. D'ailleurs, c'est tellement vrai que le module re le fait
tout seul maintenant (il garde en mémoire les dernières expressions
régulières avec leur automate, pour éviter d'avoir Í refaire la première
étape).
Oh ! Je ne savais pas ça. C'est très malin.
C'est officiel apparemment, puisque ça apparaÍ®t dans la doc de
re.compile(), Í https://docs.python.org/3/library/re.html#re.compile
| Note: The compiled versions of the most recent patterns passed to
| re.compile() and the module-level matching functions are cached, so
| programs that use only a few regular expressions at a time needn’t
| worry about compiling regular expressions.
On attendra pour savoir ce que signifie "a few"...
(Pour les dinosaures et assimilés, c'est une technique ancienne qu'on
appelle "mémoͯsation" -- sans r, et avec un z et sans accent aigu ni
tréma en Anglais.)
Le gain de temps d'exécution en cas de réutilisation est en général substantiel. D'ailleurs, c'est tellement vrai que le module re le fait tout seul maintenant (il garde en mémoire les dernières expressions régulières avec leur automate, pour éviter d'avoir Í refaire la première étape).
Oh ! Je ne savais pas ça. C'est très malin.
C'est officiel apparemment, puisque ça apparaÍ®t dans la doc de re.compile(), Í https://docs.python.org/3/library/re.html#re.compile | Note: The compiled versions of the most recent patterns passed to | re.compile() and the module-level matching functions are cached, so | programs that use only a few regular expressions at a time needn’t | worry about compiling regular expressions. On attendra pour savoir ce que signifie "a few"... (Pour les dinosaures et assimilés, c'est une technique ancienne qu'on appelle "mémoͯsation" -- sans r, et avec un z et sans accent aigu ni tréma en Anglais.) -- Alain.
Dominique
Le 15/11/2021 Í 16:22, Damien Wyart a écrit :
* Dominique in fr.comp.lang.python:
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)
Peut-être regarder Astropy (je ne connais pas en détail) : https://docs.astropy.org/en/stable/index.html
Il y a effectivement des choses très intéressantes, notamment des conversions entre angles en degrés et horaires. Merci pour le tuyau. -- Dominique Courriel : dominique point sextant ate orange en France Esto quod es
Le 15/11/2021 Í 16:22, Damien Wyart a écrit :
* Dominique <zzz@aol.com.invalid> in fr.comp.lang.python:
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)
Peut-être regarder Astropy (je ne connais pas en détail) :
https://docs.astropy.org/en/stable/index.html
Il y a effectivement des choses très intéressantes, notamment des
conversions entre angles en degrés et horaires. Merci pour le tuyau.
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
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)
Peut-être regarder Astropy (je ne connais pas en détail) : https://docs.astropy.org/en/stable/index.html
Il y a effectivement des choses très intéressantes, notamment des conversions entre angles en degrés et horaires. Merci pour le tuyau. -- Dominique Courriel : dominique point sextant ate orange en France Esto quod es