Déclinaison du Soleil en 2023

Ce petit programme lit les valeurs de déclinaison calculées par les éphémérides de l’IMCCE, et les affiche dans un calendrier.

La déclinaison du Soleil est un paramètre que le gnomoniste doit souvent prendre en compte dans ses tracés de cadrans solaires.

L’IMCCE (Institut de Mécanique Céleste et de Calculs des Éphémérides) fournit gracieusement les valeurs pour une période donnée. Reste à les présenter clairement dans un tableau-calendrier.

Pour la déclinaison du Soleil, il faut choisir “Éphémérides de position”.

Choisir le Soleil, la période souhaitée (ici, 1er janvier 2023, et 365 dates calculées), coordonnées Géocentre.

Après calculs, le portail d’éphémérides de l’IMCCE propose de télécharger les données calculées dans un fichier de format .csv.

Le code suivant fait appel au module pandas de Python, un module qui lit les données contenues dans un fichier .csv. Ici, je suppose que le fichier .csv se trouve enregistré dans le même répertoire que le fichier Python.

import pandas as pd#lecture du fichier csv
import matplotlib.pyplot as plt
import datetime#Gestion des dates
from datetime import timedelta

#Données csv issues de du portail IMCCE : https://ssp.imcce.fr/forms/ephemeris

annee=2023

tableau=pd.read_csv("EphemeridesSoleilDecl"+str(annee)+".csv", 
sep=';', #caractère de séparation des colonnes
skiprows=1, #ne pas lire la première ligne, car les noms des colonnes sont renommés plus loin
usecols=[0, 2], 
names=['date', 'declinaison'], 
parse_dates=['date'], #reconnaître la colonne date comme des dates formatées
)

Le module datetime permet de manipuler des dates et de les afficher dans un format personnalisable. Ici on a besoin de créer des dates pour le début et la fin de chaque mois, et d’afficher le n° du jour et le mois, pour chaque date.

Avec le module datetime, pour afficher les noms des jours et des mois en français, il faut ajouter en début de code les deux lignes suivantes :

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

tableau=tableau.set_index('date')#réindexer le tableau avec les dates
plt.rcParams["font.family"] = "Ubuntu"#ou autre police installée
plt.rcParams["font.size"] = 10#à adapter aux dimensions des axes

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 accéder à chaque graphe par 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 peut-être 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')

Les dimensions de la figure sont à adapter au format de la grille des 12 axes.

Ensuite, une boucle décrit successivement les 12 mois de l’année (une première boucle for), et pour chaque mois tous les jours (2e boucle for).

for N in range(1, 12+1):#N : numéro du mois courant, de 1 à 12
    ax=axs[N-1]
    date_debut=datetime.datetime(annee, N, 1)
    ax.set_title(date_debut.strftime("%B"), fontsize=13, c='blueviolet')#nom complet du mois
    ax.set_xticks([])#suppression des graduations
    ax.set_yticks([])#suppression des graduations
#    ax.axis('off')#efface les cadres des axes
    ax.set_ylim(-32, 0.5)#hauteur suffisante pour les listes de dates
    ax.set_xlim(-0.05, 0.3)#largeur suffisante pour le texte
    if N==12:
        date_fin=datetime.datetime(annee+1, 1, 1) - timedelta(days=1)#mois suivant moins 1 jour 
    else:
        date_fin=datetime.datetime(annee, N+1, 1) - timedelta(days=1)#mois suivant moins 1 jour 
    mois=tableau.loc[date_debut:date_fin]#filtrer le mois courant
    for jour in mois.index:
        Y=-float(jour.strftime('%d'))#numéro du jour, pris comme coordonnée verticale
        texte1=jour.strftime("%d %b")#N° du jours et nom abrégé du mois (nom complet : %B)
        texte2=str(round(float(mois.loc[jour, ['declinaison']]), 2)).replace('.', ',')#valeur de déclinaison lue
        ax.text(0, Y, texte1 +"    " +texte2, fontsize=8)#écriture des données

Pour trouver la date de fin du mois alors que la longueur des mois varie, je prends le 1er jour du mois suivant, auquel je retire un jour.

Fin du code :

texte="Les calculs d’éphémérides de position des corps du Système solaire ont été réalisés par le service de calcul des éphémérides de l’IMCCE à travers son portail Système solaire (https://ssp.imcce.fr)"
fig.text(0.01, 0.005, texte, fontsize=6, ha='left', va='bottom')

NomFichier="DeclinaisonSoleil_"+str(annee)
fig.savefig(NomFichier+".png", dpi=200)#création d'un fichier image PNG
fig.savefig(NomFichier+".pdf")#création d'un fichier PDF
plt.show()

Le nom du fichier est une chaîne de caractères. Je l’obtiens en concaténant plusieurs chaînes : j’ajoute l’année, puis une chaîne pour l’extension du fichier (png ou pdf).

Ce code est tel que, pour les années suivantes, il suffira de télécharger le nouveau fichier .csv, et de modifier l’année dans le début du code Python.

Soyez le premier à commenter

Laisser un commentaire