Calcul de déclinaison du Soleil avec Skyfield (module Python)

Où l’on produit un calendrier annuel de déclinaison du Soleil.

Le code proposé ici utilise deux modules Python :

Pour exécuter ce code, il vous faudra installer ces deux modules.

Commentaire du code :

import matplotlib.pyplot as plt
from skyfield.api import load
import locale# noms des mois en français

annee=2022
taille_texte=8

plt.rcParams["font.family"] = "Roboto"#ou autre police installée

locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')#dates en français

Ces dernières lignes sont les paramètres les plus susceptibles d’être modifiés par l’utilisateur.

Ensuite, il faut charger une échelle de temps du module Skyfield, ainsi qu’un fichier d’éphémérides des planètes :

ts = load.timescale()#création d'une échelle de temps pour repérer les dates avec Skyfield
planets = load('de421.bsp')#chargement d'un fichier d'éphémérides (1900-2050)
# planets = load('de430_1850-2150.bsp')# fichier d'éphémérides (1850-2150)
earth = planets['earth']
sun = planets['sun']

Un fichier ‘de421.bsp’ est chargé dans le dossier du programme, lors de la première compilation (cela prends quelques instants). Si l’on souhaite des dates au-delà de l’année 2050, il faut charger un fichier différent (plus volumineux).

Je crée ensuite une fonction retournant la valeur arrondie de la déclinaison d’une date donnée, en degrés :

# Fonction retournant la déclinaison du Soleil pour une date:
def declin(date):
    ra, dec, distance = earth.at(date).observe(sun).apparent().radec(epoch='date')
    declinaison=dec.degrees
    declinaison=str(round(declinaison, 2)).replace('.', ',')#arrondi avec virgule décimale
    return declinaison

Création d’une figure avec le module Matplotlib, avec 12 axes (un par mois), pour la présentation en calendrier :

fig, axs=plt.subplots(nrows=2, ncols=6, tight_layout=True)#création d'une figure et de 12 axes (1 par mois)
#Les graphes forment une grille de 2 lignes et 6 colonnes
#on peut modifier le nombre de grilles et colonnes, pourvu que le produit fasse 12.
axs=axs.flatten()#pour itérer sur les axes avec axs[N]
fig.set_size_inches(21/2.54, 29.7/2.54)#dimensions de la figure, en pouces
"""
En modifiant les dimensions de la figure, il faudra ajuster :
- la taille de la police
- les limites des axes en x et en y
Et réciproquement.
"""
plt.suptitle("Déclinaison du Soleil en %s"%(annee), fontsize=17, color='royalblue',
             fontweight='bold')

Pour chaque mois, la liste des jours sera affichée de haut en bas (d’où l’inversion du sens de l’axe des ordonnées). Le numéro du jours du mois sera pris comme ordonnée.

Exemple de modification de quelques paramètres pour un document en format paysage :

Pour ce dernier résultat, il faut modifier le nombre de lignes et de colonnes, mais également ajuster les dimensions de la figure (A4 paysage), l’espacement entre les dates et les déclinaisons, les abscisses limites des 12 axes, ainsi que la taille du texte.

# Mise en forme des graphiques mensuels :
for N in range(1, 12+1):#N : numéro du mois courant, de 1 à 12
    ax=axs[N-1]
    nom_mois = ts.utc(annee,N,1).utc_strftime("%B")
    ax.set_title(nom_mois, fontsize=13, c='blueviolet')#nom complet du mois
    ax.set_xticks([])#suppression des graduations
    ax.set_yticks([])#suppression des graduations
    ax.set_ylim(0, 32)#hauteur suffisante pour les listes de dates
    ax.invert_yaxis()#inversion de l'axe y, pour l'affichage des jours de haut en bas
    ax.set_xlim(-0.04, 0.4)#largeur suffisante pour le texte, à adapter à la police

Je crée ensuite une boucle while qui génère à chaque tour une date entre le 1er janvier et le 31 décembre de l’année. L’avantage de la boucle while sur la boucle for est de pouvoir gérer de la même manière les années bissextiles et les autres : la boucle continue en incrémentant les jours, tant que la date n’est pas le 1er janvier de l’année suivante.

Avec Skyfield, la commande ts.utc(2022, 2, 31) ne renvoie pas d’erreur bien que le numéro du jour dépasse le 28 février. La commande renvoie simplement le 3 mars, dans cet exemple.

Chaque date générée sera affichée dans son cadre mensuel, car on récupère son numéro de mois et son numéro de jour ; le numéro du mois est utilisé pour identifier le cadre mensuel dans lequel la date sera affichée. Le numéro du jour est pris comme coordonnée verticale du texte à afficher.

jour=ts.utc(annee,1,1)
while jour != ts.utc(annee,12,31)+1:
    N_jour = int(jour.utc_strftime("%d"))
    N_mois = int(jour.utc_strftime("%m"))
    texte1 = jour.utc_strftime("%d %b")#date abrégée
    texte2 = declin(jour)#déclinaison du jour
    axs[N_mois-1].text(0,N_jour,texte1, fontsize=taille_texte,fontweight='bold')
    axs[N_mois-1].text(0.2,N_jour,texte2, fontsize=taille_texte)
    jour = jour+1

Exemple avec une année bissextile :

Le fichier du code (compressé) :


Un ajout : modification du code pour générer un fichier .csv avec les valeurs disposées par colonnes mensuelles.

Pour cela, j’utilise le module pandas qui permet de créer des DataFrame (tableaux de données).

donnees_declinaison=pd.DataFrame(
    columns=['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre','novembre','décembre'],
    index=list(range(1,32)))

Les lignes sont les numéros du jour, et les colonnes les noms des mois. Une fois que ce tableau vide est créé, j’ajoute une ligne de code dans la boucle qui itère sur les jours de l’année, afin d’ajouter la valeur de déclinaison à l’emplacement correct (numéro du jour, et mois) :

donnees_declinaison[N_mois_complet][N_jour]=declin_flot

Cet ajout a nécessité de modifier légèrement la fonction renvoyant la déclinaison : cette fonction renvoie à la fois le résultat sous forme de chaîne de caractère et en flottant (pour le DataFrame), la logique étant d’obtenir un fichier .csv contenant des flottants pour son utilisation en tableur.

donnees_declinaison.to_csv("donnees_declinaison"+str(annee)+".csv", sep='\t')

Cette dernière ligne génère un fichier .csv à partir du DataFrame, avec l’année dans le nom du fichier, et une séparation des colonnes par Tabulations.

Ce fichier peut être ouvert par un logiciel de tableur (LibreOffice ou MS Excel, par exemple).

Le code Python en téléchargement :

Le fichier .csv de la déclinaison du Soleil en 2022 à télécharger :

Soyez le premier à commenter

Laisser un commentaire