Inscription / Connexion Nouveau Sujet
Niveau Licence Maths 1e ann
Partager :

Conversion date Python

Posté par
Theo92
23-02-22 à 21:40

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.

Posté par
carita
re : Conversion date Python 24-02-22 à 11:41

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 ?

Posté par
carita
re : Conversion date Python 24-02-22 à 11:50

... désolée, je viens de le voir dans ton énoncé
"exprimées en Jours Julien Modifiés"
je vais mettre mes lunettes :/

Posté par
Theo92
re : Conversion date Python 25-02-22 à 20:13

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.

Posté par
carita
re : Conversion date Python 25-02-22 à 22:03

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.

Posté par
Theo92
re : Conversion date Python 26-02-22 à 15:18

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?????

Posté par
carita
re : Conversion date Python 26-02-22 à 16:59

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)...]


ça a l'air long expliqué ainsi, mais le corps principal fait moins de 20 lignes de codes.

ça peut cadrer avec ce que l'on te demande ?

à noter : numpy est sans doute plus adapté (car plus rapide) avec des listes de cette taille.
mais, sauf erreur de ma part - je te laisse faire des recherches et me dire si tu trouves - , certaines méthodes n'ont pas d'équivalent avec numpy, sur les listes.
par exemple :  
ma_liste = [1,2,3,4,5,6,7]
del  ma_liste[0:5]    
==>   retourne : [6,7]

Posté par
carita
re : Conversion date Python 26-02-22 à 17:15

dans le flot précédent, une bourde de ma part, je rectifie le passage :

carita @ 26-02-2022 à 16:59

2) à partir d'un np.arange('1990-12-12' ,  '2019-12-31' , dtype = 'datetime64[D]') --- attention, le dernier jour n'est pas compris ! ==> donc le 31/12/2019 ne sera pas pris en compte dans les listes
j'ai créé une liste de dates, de la forme
dates = [('1990', '12', 18), ('1990', '12', 17), ('1990', '12', 0), ..... ('2019', '12', 10] --- ce 10  est une température
où chaque élément, pour chaque jour, est de la forme (année, mois, température)

Posté par
Theo92
re : Conversion date Python 26-02-22 à 17:31

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é.

Posté par
carita
re : Conversion date Python 26-02-22 à 17:57

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

Posté par
Theo92
re : Conversion date Python 02-03-22 à 17:21

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.

Posté par
carita
re : Conversion date Python 02-03-22 à 17:28

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+

Posté par
carita
re : Conversion date Python 02-03-22 à 17:31

et pense à mettre à jour le niveau sur ton profil,
il semblerait que tu ne sois plus en 1ère année.

Posté par
Theo92
re : Conversion date Python 02-03-22 à 20:38

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 T(t)=A \sin(\omega t + \phi) + B + Ct 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....

Posté par
Theo92
re : Conversion date Python 02-03-22 à 20:40

Avec B la température moyenne.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !