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 :

découper une chaine de dates à partir de la date du jour


Sujet :

Python

  1. #1
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 465
    Par défaut découper une chaine de dates à partir de la date du jour
    Bonjour,

    J'ai une chaine de caractère comme suit :
    mesdates=" 2008-05-09#2009-06-01#2010-01-05#2011-08-12"

    je voudrais avoir en retour la chaine suivante : "2010-01-05#2011-08-12"
    En gros, je coupe la chaine à partir de la date du jour (qui n'est pas forcément dans la chaine), et je garde la partie restante.

    une idée de fonction pour faire cela ?

    ps : j'utilise Python 2.4

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Suggestion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "#".join(mesdates.split("#")[2:])
    Ce qui donne bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    2010-01-05#2011-08-12
    Tyrtamos

  3. #3
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 465
    Par défaut ok
    merci !
    mais ta réponse ne prend pas en compte que le nombre de date est inconnu, et aussi la position de la coupure.
    là tu as mis :2 car tu vois à l'oeil que c'est à partir de la deuxieme case du tableau !

    bon, finalement je l'ai fait à la main :
    mes_jours="2008-05-09#2009-06-01#2010-01-05#2011-08-12"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mes_jours=chaine.split('#')
    				chaine=""
    				maintenant=time.strftime('%Y-%m-%d')
    				for lejour in mes_jours:
    					if lejour!="":
    						if lejour>=maintenant:
    							cpt=cpt+1
    							jour=int(lejour[8:11])
    							mois=int(lejour[5:7])
    							annee=int(lejour[0:4])
    							unedate = date(annee, mois, jour)
    							lejour= unedate.strftime('%A %d %B %Y')
    							chaine+= str(lejour) + " - "

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    from time import localtime,strftime
     
    mesdates=" 2008-05-09#2009-06-01#2010-01-05#2011-08-12"
    lidates = mesdates.strip().split('#')
     
    hui = strftime('%Y%m%d',localtime()) # c'est le jour d'hui !
    print "aujourd'hui est ",hui
     
    futures = ""
    x = lidates[0]
    if x.replace('-',"")>hui:
        futures = mesdat
    else:
        for date in lidates[1:]:
            if date.replace('-',"")>hui:
                futures = mesdat.partition(x+'#')[2]
                break
            else:
                x = date
     
    print "futures =",futures

    mesdates.strip() pour nettoyer un peu la tête et la queue de la chaîne des blancs et autres whitespaces.



    localtime() va chercher le temps dans l’horloge de l’ordinateur (il faut qu’elle soit bien réglée) et renvoie l’instant sous forme d’un tuple, dit struct_time , du genre (2009, 6, 12, 11, 12, 2, 4, 163, 1)



    strftime(format,struct_time) transforme le tuple en une chaîne selon le format spécifié par format



    J’utilise ensuite le fait qu’une relation d’ordre peut être établie entre des chaînes de chiffres et que , à condition que les mois 1,2,3,4,5,6,7,8,9 , les heures 1 à 9, les minutes, etc, interviennent dans les chaines sous forme ’01’,’02’,’03’,’04’,’05’ etc , on peut comparer des dates écrites annee-mois-jour-heure-minutes-secondes sans avoir à se casser la tête à faire des conversions de chaîne en nombre.

    C’est une astuce intéressante à connaître dans certains cas. Elle m’a servi à simplifier un code.

    Mais naturellement on peut passer par une transformation en nombre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    from time import localtime,strptime,mktime
     
    mesdates=" 2008-05-09#2009-06-01#2010-01-05#2011-08-12"
    mesdat = mesdates.strip()
    lidates = mesdat.split('#')
     
    hui = mktime(localtime()) # c'est le jour d'hui ! en secondes repéré par rapport au 01/01/1970 00:00:00
     
    print "aujourd'hui est ",localtime()
    print 'et ',hui,' en secondes depuis EPOCH'
     
    futures = ""
    x = mktime(strptime(lidates[0],'%Y-%m-%d'))
    if x>hui:
        futures = mesdat
    else:
        for date in lidates[1:]:
            if mktime(strptime(date,'%Y-%m-%d'))>hui:
                futures = mesdat.partition(x+'#')[2]
                break
            else:
                x = date
     
    print "futures =",futures

    Cependant , il y a complications de compréhension relatives au fait que le temps peut s’exprimer en UTC ou en temps local et que les fonctions fonctionnent relativement à l’une ou l’autre référence:


    mktime( t)
    This is the inverse function of localtime(). Its argument is the struct_time or full 9-tuple (since the dst flag is needed; use -1 as the dst flag if it is unknown) which expresses the time in local time, not UTC.

    localtime( [secs])
    Like gmtime() but converts to local time.


    Et j’avoue que je ne comprends pas exactement tout dans ces questions de références de temps.

    Il faut que tu examines ce point. Si ton code ne tourne pas dans une plage de 2 heures avant et 2 heures après minuit, il ne decvrait pas y avoir de problème, sinon je ne sais pas trop ce qui se passerait avec le second code.

    C’est d’ailleurs pourquoi j’avais cherché un autre moyen de comparer des chaînes de dates; au moins je sais ce que je fais.


    EDIT:

    mes codes ne marchent que si les dates dans mesdates sont de la forme “année-mois-jour“ et non pas à l’américaine.

    Sinon il faut faire un petit traitement supplémentaire pour obtenir les dates sous ce format avant de les comparer.

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Tu sors un peu la machine de guerre pour calculer le temps en secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from time import time
    print time()
    print int(time())

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Oui mais je suppose que ce qui intéresse, c’est le repérage du jour local pendant lequel le programme tourne, pas le temps universel qui est d’autant plus différent que l’ordinateur sera loin du méridien de Greenwich.

    Or :

    time( )
    Return the time as a floating point number expressed in seconds since the epoch, in UTC.


    Tandis que:

    mktime( t)
    This is the inverse function of localtime(). Its argument is the struct_time or full 9-tuple (since the dst flag is needed; use -1 as the dst flag if it is unknown) which expresses the time in local time, not UTC.


    Bon, j’avoue que je ne comprends pas parfaitement cette histoire de UTC et non UTC et que je raconte peut être des bêtises.

    Mais il me semble préférable d’utiliser mktime().

    Après , c’est à Michael de regarder de près ce qui se passe en fonction de son utilisation du code que je ne connais pas.

  7. #7
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 465
    Par défaut
    que peuis-je dire à part 'MErci' ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bash - Découper une chaine de caractères
    Par nicolas.pissard dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 16/12/2014, 13h18
  2. Remplacer dans une chaine de caractères à partir de la fin
    Par daddyel dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/01/2006, 11h31
  3. découper une chaine
    Par R@IZER dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2005, 17h04
  4. [StringTokenizer] Découper une chaine de caractere
    Par nehan dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 10/05/2005, 23h41
  5. [Débutant][Token] découper une chaine
    Par _Eric_ dans le forum Langage
    Réponses: 14
    Dernier message: 06/07/2004, 10h36

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