Bonsoir,
j'ai chargé des mesures de température associées à des dates qui sont exprimées en Jours Julien Modifiés. Par exemple, 58848 correspond au 31/12/2019 à 0h00. J'ajoute 2 400 000,5 ou 2 400 001 pour obtenir la correspondance du Jour Julien, à 0h00 ou à midi respectivement. J'ai besoin de convertir en date du calendrier grégorien sous Python, et je ne sais pas comment faire avec des éléments de code simple issus de Numpy.
En plus, je souhaiterais faire une moyenne mensuelle à partir des résultats...
Je vous remercie par avance pour votre aide.
bonjour Theo92
dans quelle type de variable est stockée ta date julienne ?
comment faire avec des éléments de code simple issus de Numpy.
avant de coder, tu dois construire un algorithme bien structuré, incontournable ici.
ensuite,
les opérations à utiliser sont simplement addition, soustraction, multiplication, division,
et la fonction partie entière : numpy.trunc(x)
n'hésite pas à donner ton début de code pour que l'on puisse mieux t'aider,
ainsi que tous les éléments dont tu disposes (un énoncé complet est toujours préférable)
ps : "Par exemple, 58848 correspond au 31/12/2019 à 0h00."
ce nombre 58848 m'étonnait... tu veux dire de jours julien modifiés ?
... désolée, je viens de le voir dans ton énoncé
"exprimées en Jours Julien Modifiés"
je vais mettre mes lunettes :/
Bonsoir Carita.
je ne suis pas parvenu à coder la conversion, mais je pense avoir trouvé comment composer une liste de dates avec np.arange('1990-12-12' , '2022-02-25' , dtype = 'datetime64[D]').
En tout cas, ça marche....
La question qui reste en suspend est que si on a une mesure de température par jour sur la période, comment extraire des moyennes mensuelles, annuelles?
J'ai donc un tableau Numpy 1D de dates, et un autre de températures. Et je veux une valeur par mois correspondant à la moyenne mensuelle (respectivement annuelle) pour une représentation graphique.
Je vous remercie pour votre aide.
bonsoir Theo92
oui, np.arange('1990-12-12' , '2022-02-25' , dtype = 'datetime64[D]') , ça "marche",
mais encore faut-il que cela répondre à la question posée dans l'énoncé, et exactement aux dates de l'énoncé.
(attention toutefois à convertir tes éléments en type chaine pour pouvoir mieux les manipuler ensuite)
parce que si j'ai bien compris, tu disposes au départ d'un array de dates juliennes.
ce n'est pas si difficile à convertir en grégorien.
==> je t'ai trouvé ce lien
qui te donne quasiment l'algorithme, et un exemple de conversion julien/grégorien :
tu n'as plus qu'à coder la fonction en python pour convertir.
souviens-toi que dans un tableau, les éléments sont identifiables (accessibles) par un indice qui varie de 0 à len(tableau)-1
(vas farfouiller dans tes anciens topics, je t'avais donné des liens sur le sujet).
je suppose que tes 2 fichiers (dates et temp) sont rangés dans le même ordre, et donc que les indices correspondent.
avec cette fonction (de conversion), tu peux choisir de créer une nouvelle liste de dates converties,
voire directement une liste de tuples (date, température), comme dans l'exo de l'autre jour.
nb : tu peux aussi décider de ne pas créer de nouvelle liste, et travailler en séquentiel sur ta liste de départ :
mais à mon avis, cela sera moins facile à gérer pour calculer les moyennes...
---
concernant les moyennes mensuelles, dans le principe c'est simple :
on additionne toutes les températures d'un mois, et on divise par le nombre de jours dans le mois.
idem pour mes moyennes annuelles : on totalise les temp. de l'année, et on divise par le nombre de jour dans l'année.
la difficulté va consister à choisir une méthode qui va te permettre de sélectionner un groupe de dates (mois ou année) issues de ta liste.
il y a vraiment plusieurs façons de faire... à mon avis, les listes par compréhension peuvent bien simplifier les tris, et donc le code...
voilà quelques éléments de réflexion que je te propose, mais - je le répète - il y a, comme souvent, plusieurs façons d'aborder cet algorithme.
n'hésite pas à montrer où tu en es, si besoin d'aide.
Bonjour Carita,
je vous remercie pour l'immense disponibilité dont vous faites preuve.
Je n'y parviens pas, en dépit d'une nuit presque blanche. Je récapitule.
N'ayant pas réussi à convertir les dates au format standard, j'ai construit ma plage de dates avec dates = np.arange('1920-08-17','2019-12-31', dtype = 'datetime64[D]') . Les températures étant dans un tableau 1D directement issu du loadtext.
J'ai tenté de construire un DataFrame data = {'jour':dates, 'temp':temp} puis df = pd.DataFrame(data), pour pouvoir utiliser df_mois = df.resample("M").mean(). Mais cela ne fonctionne pas car dates est un RangeIndex, et Python attend un DateTimeIndex.
Je n'arrive pas à plus. L'idée est d'extraire les températures et d'en faire une liste de moyenne par mois, associé à une liste de mois sur la période pour une représentation graphique?????
bonjour Theo92,
pour la conversion de dates juliennes en grégorien, il te suffit de suivre à la lettre la description de l'algo du lien que je t'ai indiqué.
mais si tu veux, on garde ce point pour la fin.
toutefois, j'aimerais bien savoir à quoi ressemble le contenu de ton tableau de départ.
tu peux m'en montrer les premiers éléments ?
il est essentiel que je voie la 'structure' des éléments de ce tableau pour pouvoir les utiliser ensuite.
---
j'étais justement en train d'avancer le code sur ton exo.
comme dit sur ton autre topic, je ne maitrise pas tout en python (loin de là), mais avec des outils simples, on y arrive.
pour le moment, j'ai établi la liste des moyennes mensuelles, et celle des moyennes par mois.
j'allais m'attaquer aux graphiques...
perso, j'aime bien travailler avec les listes : les opérateurs et les méthodes existantes sur les listes offrent beaucoup de souplesse et de possibilités.
nb1 : on peut toujours faire plus compliqué ! et il existe peut-être plus simple pour ton exo.
nb2 : si tu maitrises, tu peux aussi utiliser les dictionnaires
pour te donner une idée, voici les étapes de ce que j'ai fait pour le moment;
après, tu adapteras comme tu le souhaites :
1) création de 2 fonctions (def) - une liste en argument :
une pour calculer la moyenne annuelle - en return : (année, moyenne)
l'autre pour la moyenne mensuelle - en return : (année, mois, moyenne)
2) à partir d'un np.arange('1990-12-12' , '2019-12-31' , dtype = 'datetime64[D]')
j'ai créé une liste de dates, de la forme
dates = [('1990', '12', 18), ('1990', '12', 17), ('1990', '12', 0), ..... ('2019', '12', 30 ]--- attention, le dernier jour n'est pas compris !
qui contient autant d'éléments (moins 1) que le tableau de départ (tous les jours, toutes les années),
et où chaque élément, pour chaque jour, est de la forme (année, mois, température) (évidemment, j'ai généré des temps en randint)
3) une boucle : tant que le fichier dates n'est pas vide :
a) je lis la 1ère année et je créée une liste par compréhension de tous les éléments relatifs à cette année : donc, j'extrais une partie de la liste dates
annee = [('1990', '12', 20), ('1990', '12', 10), ....('1990', '12', 14)] --- contient 20 éléments
b) calcul de la moyenne de l'année
c) autre boucle imbriquée : tant que annee n'est pas vide
- crée une liste par compréhension de tous les éléments relatifs au premier mois
- calcule la moyenne de ce mois
- on supprime le mois dans annee --- le premier élément de la liste annee sera donc du mois suivant...
d) je supprime annee dans dates ---- mm principe : le premier élément de la liste dates sera donc de l'année suivante...
à l'issue de ce code, j'ai les 2 listes prêtes à être exploitées pour les graphiques :
liste moyenne année [('1990', 9.95), ('1991', 10.72)...]
liste moyenne mois [('1990', '12', 9.95), ('1991', '01', 10.03), ('1991', '02', 11.25), ('1991', '03', 17.0)...]
dans le flot précédent, une bourde de ma part, je rectifie le passage :
Merci à nouveau Carita.
Je vous communique les premières lignes du tableau de données.
22553 22.6
22554 22.6
22555 24.8
22556 17.5
22557 16.5
22558 18.3
22559 18.1
22560 16.8
22561 17.0
22562 17.5
22563 18.0
22564 17.8
22565 17.7
22566 17.6
Il comprend 36295 entrées du 17/08/1920 au 31/12/2019.
Je planche sur les précieux éléments que vous m'avez confié.
ok
donc chaque élément a 2 composantes : le jour en date julienne et sa température (à récupérer en type float)
les n° de jours julien semblent tous se suivre (à vérifier s'il n'y a pas de trous...)
ils correspondent à une époque récente, donc normalement la conversion ultérieure ne devrait pas amener à des surprises (?)
bon courage 
Bonjour Carita.
J'ai tardé à vous remercier, car cela a été long, mais je suis parvenu au résultat. Même à montrer avec un curve_fit que l'on a une augmentation satistiquement significative de température sur le dernier siècle......
Un grand merci pour votre immense disponibilité, et vos précieux conseils.
Bonne journée.
bonjour Theo92,
merci pour le retour, je vais pouvoir jeter mes notes à présent.
à une prochaine fois
ps : sur le graphique des moyennes mensuelles, sais-tu comment redéfinir l'axe des abscisses pour un affichage de la forme année/mois ?
comment tu as fait? avec un datetime ? ou bien tu n'as mis que les mois sur cet axe ?
je n'ai pas trouvé la solution... si tu as un peu de temps pour me dire, je suis preneuse.
a+
Je ne l'ai pas fait. Je m'en suis tenu aux moyennes mensuelles. Après, j'ai fait un ajustement sinusoïdal pour la saisonnalité, et un ajustement pour récupérer le paramètre C, calculé sur des tranches décennales, marquant la pente de la droite sur un siècle de l'augmentation lente de la température....
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :