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 :

opérations sur les durées et dates


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut opérations sur les durées et dates
    Bonjour à tous,

    Je cherche en vain depuis plusieurs jours à apprendre à bien manipuler les dates et les durées en python (avec datetime et pandas)...
    Ma question est donc la suivante : sauriez-vous où je peux trouver un tuto ou toute autre ressource traitant de manière précise et approfondie la manipulation des dates et durées de manière la plus globale qu'il soit ?

    Voici, entre autre, ce que je souhaite être en mesure de :
    - transformer des secondes au format hh:mm:ss tout en conservant la possibilité d'effectuer des opérations sur les données (ex: to_time(seconds=400) -» 00:06:40)
    - paramétrer à la volée les jours de début de semaine (dans le cadre d'un df.groupby(df.date.dt.week) par exemple, je veux que la semaine commence un lundi)
    - regrouper des valeurs par intervalles spécifiques
    - afficher en ordonnée d'un plot des durées et faire des histogrammes avec des durées !!! Ça rejoint le premier point mais dieu que je me prends la tête avec ça depuis plusieurs jours.
    - effectuer des opérations sur des durées (exemple : 00:30:22 / 2 = 00:15:11 sans avoir à changer de formatage avant et après chaque opération)

    Je sais qu'il existe un certaine datetime.time() mais je n'arrive pas à l'employer tel que j'imaginais qu'il fonctionne.
    Bref, je souhaite pouvoir maitriser la manipulation des séries temporelles et fonctions associées. Une idée des ressources les plus pratiques à ce sujet ?

    Merci beaucoup par avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    La machine représente dates et durées sous la forme d'un nombre flottant de secondes (ou d'un nombre entier de millisecondes ou nanosecondes).

    Les humains ont des traditions pour représenter dates et heures sous différents formats (14h00 ou 2 pm?) mais ce sont des chaines de caractères à produire (avec un format spécifique) ou à lire (depuis un format spécifique) pour convertir çà en nombre flottant.

    Côté programmation, datetime est un "helper": il emballe le nombre flottant dans une structure de donnée qui permettra d'y retrouver années, mois, jours,... et d'être utilisable pour écrire bon nombre d'application sans avoir à écrire de ligne de code (excepté préciser les format de lecture et d'écriture).

    Cette démarche (on prend tout ce qui existe pour le représenter sous une forme canonique avec laquelle la machine pourra bosser puis on le ressort sous une forme lisible par les humains) est assez générique (en informatique), vous la retrouvez pour les polices de caractères, les protocoles réseaux,...

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Salut
    Pour les ressources, je ne vois guère que la doc officielle. Tu peux tenter "python datetime" dans ton moteur de recherche.
    Mais il y a un outil essentiel que tu ne mentionnes pas: le timedelta, qui peut te calculer tout décalage de date y compris les plus farfelus.
    Exemple pour ton to_time(seconds=400): (datetime.datetime.now().replace(hour=0, minute=0, second=0)+datetime.timedelta(seconds=400)).strftime("%H:%M:%S").
    Et pour ta division par 2: print((datetime.datetime(1, 1, 1, 0, 30, 22) - datetime.datetime(1, 1, 1, 0, 0, 0)) / 2).

    Le point essentiel à piger c'est que les dates sont codées en interne sous forme d'une énorme suite de secondes (un timestamp). Le reste ce n'est qu'un affichage "humanisé" de ce timestamp.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Salut,

    Oui, j'épluche effectivement la doc officielle mais j'ai encore un peu de mal à comprendre pourquoi il existe plusieurs types d'objets pour représenter, finalement, la même chose.
    Comme tu le précises, le timestamp est une suite de secondes ; pourquoi ne peut-on pas diviser ce timestamp en deux par exemple ?
    print((datetime.datetime(1, 1, 1, 0, 30, 22) - datetime.datetime(1, 1, 1, 0, 0, 0)) / 2) c'est bien ce que je redoutais...

    Je pense que, pour le moment, je travaillerais sur des secondes uniquement puis les passerais en hh:mm:ss une fois toutes les manipulations réalisées. Tant-pis pour la présentation des tableaux intermédiaires. Au pire, j'irais me créer ma propre classe si vraiment je ne trouve pas mieux

    Je vais continuer à en apprendre plus sur la doc officielle ; même si elle ne réponds pas à la présente question, elle me sera très certainement bien utile par la suite et pour mes autres interrogations au sujet de la manipulation des dates.

    Merci pour ce retour.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BioKore Voir le message
    Oui, j'épluche effectivement la doc officielle mais j'ai encore un peu de mal à comprendre pourquoi il existe plusieurs types d'objets pour représenter, finalement, la même chose.
    C'est vrai aussi que parfois j'ai un peu de mal. Je veux une date j'utilise l'objet "date" mais on ne peut pas faire un écart entre deux dates, on ne peut demander qu'un écart entre deux "datetime" qui, même s'il ressemble fortement au premier (probablement en hérite-t-il d'ailleurs), n'est pas la même chose ; d'où mon exemple où pour travailler sur deux "time" je suis obligé de travailler sur deux "datetime" en mettant des valeurs neutres et surtout identiques pour aa, mm, jj. Toutefois n'ayant pas non plus trop eu l'habitude d'éplucher ces objets, peut-être qu'il y a une autre solution un peu plus élégante (en général dans ce genre de cas, souvent wiztricks arrive et re-écrit tout ça en 10 fois plus simple ).

    Citation Envoyé par BioKore Voir le message
    Comme tu le précises, le timestamp est une suite de secondes ; pourquoi ne peut-on pas diviser ce timestamp en deux par exemple ?
    Ah si ça on peut => datetime.now().timestamp()/2. Il y a juste cette méthode datetime.timestamp() à utiliser. Là c'est probablement parce qu'il y a une étape intermédiaire entre le temps "machine" (suite de secondes) et le temps "python" (objet datetime) qui oblige alors, quand on a un temps "python", à passer par une méthode qui redescend ce temps en temps "machine".

    Citation Envoyé par BioKore Voir le message
    Je pense que, pour le moment, je travaillerais sur des secondes uniquement puis les passerais en hh:mm:ss une fois toutes les manipulations réalisées. Tant-pis pour la présentation des tableaux intermédiaires.
    Je crois que travailler dans le format natif c'est ce qu'il y a en effet de plus pérenne (et probablement, avec l'habitude qui viendra avec le temps, de plus rapide). Mais je ne pense pas que cela gêne vraiment tes tableaux intermédiaires. Après-tout, si tu pars du principe que l'affichage n'est qu'un détail de ton projet (philosophie MVC), alors tu peux créer des routines permettant d'afficher un date, time ou datetime au format que tu souhaites puis appeler ces routines à chaque fois que tu as besoin de sortir un tableau.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par BioKore Voir le message
    Comme tu le précises, le timestamp est une suite de secondes ; pourquoi ne peut-on pas diviser ce timestamp en deux par exemple ?
    print((datetime.datetime(1, 1, 1, 0, 30, 22) - datetime.datetime(1, 1, 1, 0, 0, 0)) / 2) c'est bien ce que je redoutais...
    La différence entre 2 datetime est un timedelta:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import datetime as dt
    >>> dt.datetime(1, 1, 1, 0, 30, 22) - dt.datetime(1, 1, 1, 0, 0, 0)
    datetime.timedelta(seconds=1822)
    >>> >>> dt.datetime(1, 1, 1, 0, 30, 22) - dt.datetime(1, 1, 1, 0, 0, 0)
    datetime.timedelta(seconds=1822)
    Et çà se divise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> _/2
    datetime.timedelta(seconds=911)
    Et si on fait la même chose avec "print", l'affichage est différent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> print((dt.datetime(1, 1, 1, 0, 30, 22) - dt.datetime(1, 1, 1, 0, 0, 0)))
    0:30:22
    >>> print((dt.datetime(1, 1, 1, 0, 30, 22) - dt.datetime(1, 1, 1, 0, 0, 0)) / 2)
    0:15:11
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Opérations sur les dates
    Par coyotte507 dans le forum Contribuez
    Réponses: 12
    Dernier message: 07/03/2007, 13h32
  2. Opération sur les dates
    Par alainGL dans le forum Access
    Réponses: 2
    Dernier message: 07/03/2007, 08h27
  3. Opération sur les dates
    Par obily dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 19/01/2007, 14h30
  4. opération sur les dates
    Par AMARI_SALIM dans le forum Langage
    Réponses: 14
    Dernier message: 19/07/2006, 18h05
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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