Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

N'oubliez pas de cocher la case « Ajustement pour l'heure d'été » dans votre profil.

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 06/12/2017, à 12:23

DonutMan75

[RESOLU] [Python] gestion des dates avec numpy ?

Hello,
je suis débutant en Python et je souhaite convertir des dates données au format année/mois/jour numpy array en un Timestamp simple.

Mon fichier d'entrée contient les années, mois et jours de mes mesures selon le format suivant :

$ head data.txt
2013 01 01
2013 01 02
2013 01 03
2013 01 04

Voici ce que j'ai déjà fait :

#! /usr/bin/python
import numpy as np
[yearv, monthv, dayv] = np.loadtxt(myfile, unpack=True);

yearv, monthv et dayv sont donc des numpy array.

Ce que j'ai déjà tenté (sans succès) :

  • utilisation de numpy.datetime64(x) : cette fonction retourne un timestamp à partir d'un string x (pas adapté à mon cas, j'ai trois vecteurs...)

  • utilisation de calendar.timegm(x) : cette fonction retourne un timestamp à partir d'un tuple de la forme (année, mois, jour, heure, minute, seconde), c'est pas mal mais je ne sais pas convertir mes array numpy yearv, monthv, dayv en tuple... Une boucle for pourrait faire l'affaire mais n'y a t'il pas quelque chose de plus optimisé ?

  • la bibliothèque time ??

  • la biblitothèque datetime ??

  • autre idées ???

Avez-vous des idées ? des suggestions ?

Merci d'avance et bonne journée smile

Donut

Dernière modification par DonutMan75 (Le 06/12/2017, à 16:20)

Hors ligne

#2 Le 06/12/2017, à 12:39

pingouinux

Re : [RESOLU] [Python] gestion des dates avec numpy ?

Bonjour,
Avec ton exemple, peux-tu montrer le fichier que tu veux en sortie ?

Hors ligne

#3 Le 06/12/2017, à 12:43

shoot76

Re : [RESOLU] [Python] gestion des dates avec numpy ?

Bonjour,

Ce que je ferais (c'est certainement optimisable) :
- Convertir tes arrays en une seule et même array avec un format défini.
- Pour chaque élément de ta liste, créer un objet datetime suivant le format défini précédemment
- ajouter ton objet datetime à une liste qui contiendra tous tes timestamps

un truc du genre :

import numpy as np
from datetime import datetime
import time

d = np.ones((20))
m = np.ones((20))
y = np.ones((20))

result = []

for i in range(0,len(d)):
    t = datetime(int(y[i]), int(m[i]), int(d[i]))
    result.append(time.mktime(t.timetuple()))
print(result)  

Je pense que c'est optimisable largement. Mais au moins, ça fonctionne smile


~ La mort d'une personne est une tragédie, celle d'un million c'est des statistiques. [J. Staline]

Hors ligne

#4 Le 06/12/2017, à 12:49

bipede

Re : [RESOLU] [Python] gestion des dates avec numpy ?

from datetime import datetime, timedelta

dateAConvertir = datetime(2017, 12, 06)
pointDeDepart = datetime(1970, 01, 01)
timestamp = (dateAConvertir - pointDeDepart) / timedelta(seconds=1)

Desktop: MSI - Intel® Core™ i5-3330 CPU @ 3.00GHz × 4 - RAM 8 go- Ubuntu 18.04 - Système sur SSD 64 Go - /home sur HDD 500 Go.
Laptop: DELL Inspiron-15 3567 - Intel® Core™ i5-7200 CPU @ 2.50GHz × 4 - RAM 8 go - HDD 1 To - Ubuntu 18.04 avec /home séparé.

Mon site: Les contributions du bipède

Hors ligne

#5 Le 06/12/2017, à 13:16

DonutMan75

Re : [RESOLU] [Python] gestion des dates avec numpy ?

Hello,
merci à vous pour vos retours super rapide !

Pingouinux, désolé je n'étais peut-être pas très clair. Ce que je souhaite en sortie c'est un vecteur S qui contiennent les timestamps associés à chaque ligne de mon fichier.

Ainsi puisque la première ligne de mon fichier est "2013 01 01", je souhaiterais que la première valeur de mon vecteur soit S[0] = 4749
(ici j'ai choisi la convention MJD2000 : S représente le nombre de jour écoulés depuis le 1er janvier 2000 à minuit, mais une autre convention me convient bien je peux convertir par la suite). L'idée étant au final de générer des graphiques avec pyplot(x,y) avec le temps en abscisses et une autre quantité en ordonnées (non présenté ici).

Mon problème est de jongler élégamment entre les type numpy array, les vecteurs, les tuples... Je suis nouveau en Python et je m'y perds facilement... et j'ai peur de faire des trucs qui fonctionnent mais qui ne sont pas super propre pour un habitué du python ^^

shoot76, oui avec ce bout de code ça se déroule correctement ! Bon du coup, je dois jongler entre les fonctions de 3 bibliothèques différentes pour gérer le temps. C'est pas facile de savoir où trouver l'information quand on débute ^^

bipede, merci pour ta suggestions, je crois que je vais utiliser ça pour convertir mon vecteur dans un format que je maîtrise. Néanmoins mon soucis portait plus sur la conversion d'un ensemble de vecteurs plus que sur la conversion d'un point donné

Merci encore et à bientôt smile

Donut

Hors ligne

#6 Le 06/12/2017, à 13:33

DonutMan75

Re : [RESOLU] [Python] gestion des dates avec numpy ?

Hello Bipede,
j'ai un soucis avec ta commande :

t0 = datetime(2013, 11, 27, 0, 0)
tref = datetime(2000, 1, 1, 0, 0)
(t0-tref)/timedelta(seconds=1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-93-e4d23de3091f> in <module>()
----> 1 (t0-tref)/timedelta(seconds=1)

TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'datetime.timedelta'

As-tu une idée d'où ça pourrait venir ?

EDIT : ça semble marche en utilisant : datetime.toordinal(t0) - datetime.toordinal(tref)

Dernière modification par DonutMan75 (Le 06/12/2017, à 13:35)

Hors ligne

#7 Le 06/12/2017, à 13:35

pingouinux

Re : [RESOLU] [Python] gestion des dates avec numpy ?

Tu peux faire ceci :

#! /usr/bin/python
import sys
from time import strptime, strftime
myfile=sys.argv[1]

def secondes(ma_date): return int(strftime("%s",strptime(ma_date,"%Y %m %d\n")))

with open(myfile,'r') as f:
   resul = []
   S0 = secondes("2000 01 01\n")
   for lig in f: resul.append((secondes(lig)-S0)//86400)

print(resul)

qui donne ce résultat :

$ ./donut.py data.txt 
[4749, 4750, 4751, 4752]

Hors ligne

#8 Le 06/12/2017, à 16:20

DonutMan75

Re : [RESOLU] [Python] gestion des dates avec numpy ?

Rebonjour Pingouinux,
super c'est *exactement* ce que je souhaitais obtenir !

Merci beaucoup smile

Bonne journée à tous,

Donut

Hors ligne

#9 Le 06/12/2017, à 16:27

bipede

Re : [RESOLU] [Python] gestion des dates avec numpy ?

DonutMan75 a écrit :

Hello Bipede,
j'ai un soucis avec ta commande :

t0 = datetime(2013, 11, 27, 0, 0)
tref = datetime(2000, 1, 1, 0, 0)
(t0-tref)/timedelta(seconds=1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-93-e4d23de3091f> in <module>()
----> 1 (t0-tref)/timedelta(seconds=1)

TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'datetime.timedelta'

As-tu une idée d'où ça pourrait venir ?

EDIT : ça semble marche en utilisant : datetime.toordinal(t0) - datetime.toordinal(tref)

Je pense que c'est parce que tu utilises Python2 alors que moi j'utilise Python3


Desktop: MSI - Intel® Core™ i5-3330 CPU @ 3.00GHz × 4 - RAM 8 go- Ubuntu 18.04 - Système sur SSD 64 Go - /home sur HDD 500 Go.
Laptop: DELL Inspiron-15 3567 - Intel® Core™ i5-7200 CPU @ 2.50GHz × 4 - RAM 8 go - HDD 1 To - Ubuntu 18.04 avec /home séparé.

Mon site: Les contributions du bipède

Hors ligne