IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Conversion d'un vecteur de dates MATLAB


Sujet :

Python

  1. #1
    Membre éclairé Avatar de habasque
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Septembre 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 530
    Par défaut Conversion d'un vecteur de dates MATLAB
    Bonjour à tous,

    Je cherche à convertir un vecteur "matlab_datenum" qui contient des dates au format MATLAB:
    [[735275]
    [735275]
    [735276]
    ...,
    [730395]
    [730395]
    [730396]]
    J'utilise le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    python_datetime = datetime.fromordinal(matlab_datenum.astype(int))
    Mais j'obtiens l'erreur suivante:
    TypeError: only length-1 arrays can be converted to Python scalars
    Je comprends bien l'erreur mais je ne souhaite pas faire une boucle pour passer les éléments un par un à la fonction fromordinal.
    Y a t-il des alternatives ?

    Merci d'avance,

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Faudrait mettre un peu plus de code car là difficile de t'aider ...

    Comment est ce que tu lis le fichier présenté ?
    Comment construis-tu la variable matlab_datenum ?
    Quel est le résultat attendu ?

  3. #3
    Membre éclairé Avatar de habasque
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Septembre 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 530
    Par défaut
    Bonjour,

    La lecture du fichier se fait comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f = 'D:/mon_fichier.mat' 
    x = scipy.io.loadmat(f)
    time_drogue_on = x['time_drogue_on'].T
    La variable "datenum" est construit comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    matlab_datenum = np.empty((np.size(time_drogue_on)))
    matlab_datenum  = time_drogue_on.astype(int)
    Le résultat attendu est un vecteur de dates au format Python datetime.datetime.

    Merci !

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Ca n'a pas l'air si trivial que je le pensais.
    Pourquoi ne pas vouloir faire de boucle ? Car ca se fait assez simplement tout de même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mes_datetime = [datetime.fromordinal(elt) for elt in matlab_datenum ]
    Sans faire de boucle for, peut-être une piste du côté de pandas :
    https://pandas.pydata.org/pandas-doc..._datetime.html


    NB : Ecrire cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    matlab_datenum = np.empty((np.size(time_drogue_on)))
    matlab_datenum  = time_drogue_on.astype(int)
    est inutile car la 2eme ligne vient écraser le résultat de la 1ere ! Donc tu peux enlever la 1ere ligne.

  5. #5
    Membre éclairé Avatar de habasque
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Septembre 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 530
    Par défaut
    Bonjour,

    Je voulais éviter de faire une boucle car j'ai 500000 éléments à traiter. Avec une boucle le traitement est très très long.

    Je me suis inspiré du code proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mes_datetime = [datetime.fromordinal(elt) + timedelta(days=elt%1) - timedelta(days = 366) for elt in matlab_datenum ]
    mais j'ai une erreur sur l'utilisation de 'timedelta':
    TypeError: unsupported type for timedelta days component: numpy.ndarray

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par habasque Voir le message
    Je voulais éviter de faire une boucle car j'ai 500000 éléments à traiter. Avec une boucle le traitement est très très long.
    Pour faire faire le boulot par numpy, il faut convertir le tableau avec .astype avec 'M8[D]' en argument (documenté ici) après avoir ajouté l'offset qui va bien (les bases de temps étant différentes).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Citation Envoyé par habasque Voir le message
    Je me suis inspiré du code proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mes_datetime = [datetime.fromordinal(elt) + timedelta(days=elt%1) - timedelta(days = 366) for elt in matlab_datenum ]
    mais j'ai une erreur sur l'utilisation de 'timedelta':
    TypeError: unsupported type for timedelta days component: numpy.ndarray
    Le message d'erreur est relativement clair : le type de la donnée fournie à timedelta n'est pas celui attendu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    matlab_datenum = np.array([735275,735275,730395,730396])
    print(type(matlab_datenum[0]))  ### Remarquons que ce n'est pas un int
    #t=timedelta(days=matlab_datenum[0])  ### Produit une erreur
    t=timedelta(days=int(matlab_datenum[0])) ### Correct
    Note que d'utiliser une liste en intention c'est quand même aussi faire une boucle for indirectement ... C'est plus performant que de faire des append dans une boucle for, mais ca reste itératif. Donc voit les performances que tu obtiens avec ça si ça te convient. Sinon il faudra te pencher sur ce que propose wiztricks et tu auras en sortie un type numpy.datetime64 et pas une liste de datetime ...

Discussions similaires

  1. Conversion dates MATLAB vers Excel
    Par harafado dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/04/2009, 12h47
  2. [Dates] Conversion d'un string en date
    Par ludo2612 dans le forum Langage
    Réponses: 9
    Dernier message: 04/02/2008, 21h15
  3. conversion d'un format de date du type 13/06/2007
    Par pierre2410 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/06/2007, 14h26
  4. conversion d'une chaine en date
    Par monphp dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/05/2007, 10h29
  5. [Dates] Conversion d'un text en date
    Par sagitarium dans le forum Langage
    Réponses: 1
    Dernier message: 07/06/2006, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo