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 :

comment lister les mois à partir d'une date


Sujet :

Python

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 384
    Points : 859
    Points
    859
    Par défaut comment lister les mois à partir d'une date
    bonjour,

    existe-il en python un moyen d'obtenir la liste des debuts et fins de mois à partir d'une date donnée.

    par exemple, je donne le 15 mai 2014
    et ça me retour :
    debut ; fin
    15/05/2014 ; 30/05/2014
    01/06/2014 ; 30/06/2014

    et ce, jusqu'à la fin de l'année en cours.

    une idée ? ou bien ça doit se faire manuellement avec des sommes de dates..?

    merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    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 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,
    Citation Envoyé par Michael REMY Voir le message
    existe-il en python un moyen d'obtenir la liste des débuts et fins de mois à partir d'une date donnée.
    Pour récupérer le nombre de jours d'un mois de l'année, vous pouvez utiliser:
    calendar.monthrange:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import calendar
    >>> calendar.monthrange(2014, 5)
    (3, 31)
    >>>
    note: il y a 31 jours au mois de Mai. Si vous vouliez 30 jours, c'est une autre république qu'il vous faut, et Python ne peut rien à cà

    ou l'astuce de soustraire un jour au premier jour du mois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> import datetime 
    >>> datetime.date(2014, 6, 1) - datetime.timedelta(days=1)
    datetime.date(2014, 5, 31)
    >>> datetime.date(2015, 1, 1) - datetime.timedelta(days=1)
    datetime.date(2014, 12, 31)
    >>>
    C'est une réponse partielle.
    On a le jour de la fin de mois pour une année donnée.
    Construire la liste de tuples (début, fin) jusqu'à la fin de l'année reste à faire.

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

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 384
    Points : 859
    Points
    859
    Par défaut
    grand merci à ta solution, je ne connaissais pas monthrange !
    en cherchant un peu j'ai pil-poil trouvé mon bonheur !

    http://alexharvey.eu/tag/calendar-monthrange/

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import calendar
    from datetime import datetime, timedelta
     
    start = datetime.strptime("20Jan1970","%d%b%Y")
    end = datetime.strptime("23Jan1972","%d%b%Y")
     
    print start
    print
     
    counter = start
    while counter <= end:
     
        # Number of days in counters month
        maxDay = calendar.monthrange(counter.year, counter.month)[1]
     
        # First iteration starts from start.day not 1
        if counter.month == start.month and counter.year == start.year:
            chunkStart = datetime(year=counter.year, month=counter.month, day=start.day)
        else:
            chunkStart = datetime(year=counter.year, month=counter.month, day=1)
     
        # Laster iteration ends on end.day not maxDay
        if counter.month == end.month and counter.year == end.year:
            chunkEnd = datetime(year=counter.year, month=counter.month, day=end.day)
        else:
            chunkEnd = datetime(year=counter.year, month=counter.month, day=maxDay)  
     
        # Increase counter by one month
        counter += timedelta(days=maxDay)
     
        print chunkStart.date(), chunkEnd.date()
     
    print
    print end
    produisant :

    1970-01-20 1970-01-31
    1970-02-01 1970-02-28
    1970-03-01 1970-03-31
    1970-04-01 1970-04-30
    1970-05-01 1970-05-31
    1970-06-01 1970-06-30
    1970-07-01 1970-07-31
    1970-08-01 1970-08-31
    1970-09-01 1970-09-30
    1970-10-01 1970-10-31
    1970-11-01 1970-11-30
    1970-12-01 1970-12-31
    1971-01-01 1971-01-31
    1971-02-01 1971-02-28
    1971-03-01 1971-03-31
    1971-04-01 1971-04-30
    1971-05-01 1971-05-31
    1971-06-01 1971-06-30
    1971-07-01 1971-07-31
    1971-08-01 1971-08-31
    1971-09-01 1971-09-30
    1971-10-01 1971-10-31
    1971-11-01 1971-11-30
    1971-12-01 1971-12-31
    1972-01-01 1972-01-23
    résolu!

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    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 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Ah ben si vous vouliez en plus le code qui va avec, il fallait le dire!
    Je proposerai plutôt çà:
    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
    25
    26
    from calendar import monthrange
    from datetime import date
     
    _DELTA_ONE_DAY = datetime.timedelta(days=1)
    def gen_month_list(from_dt, last_dt=None):
        dt = from_dt
        last_dt = last_dt or (date(dt.year+1, 1, 1) - _DELTA_ONE_DAY)
        while dt < last_dt:
            year, month = dt.year, dt.month
            day_number = monthrange(year, month)[1]
            last_date = date(year, month, day_number)
            if last_date > last_dt:
                last_date = last_dt
            yield dt, last_date
            dt = last_date + _DELTA_ONE_DAY
     
    if __name__ == '__main__':     
        print ('sample')
        for s, e in gen_month_list(date(2014, 5, 15)):
            print (s, e)
        print('check bounds: last months')    
        for s, e in gen_month_list(date(2014, 12, 15)):
            print (s, e)
        print('check bounds: year overlaps + last_dt')       
        for s, e in gen_month_list(date(2014, 12, 15), date(2015, 3, 15)):
            print (s, e)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 384
    Points : 859
    Points
    859
    Par défaut
    je réouvre.

    ne pas utiliser cette solution car elle a un ptit bug étrange que je n'arrive pas à résoudre.
    quand on le fait pour de 13 mai 2013 au 12 mai 2014 alors la dernier moi partiel n'est pas affiché (du 01/05/2015 à 12/05/2015) et s'arrête à 01/04/2014-30/04/2015)
    pourtant un jour avant (12 mai 2013 au 12 mai 2014) ça marche ! très très très étrange .

    pourquoi après le 13 mai ça ne marche plus.....


    Citation Envoyé par Michael REMY Voir le message
    grand merci à ta solution, je ne connaissais pas monthrange !
    en cherchant un peu j'ai pil-poil trouvé mon bonheur !

    http://alexharvey.eu/tag/calendar-monthrange/

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import calendar
    from datetime import datetime, timedelta
     
    start = datetime.strptime("20Jan1970","%d%b%Y")
    end = datetime.strptime("23Jan1972","%d%b%Y")
     
    print start
    print
     
    counter = start
    while counter &lt;= end:
     
        # Number of days in counters month
        maxDay = calendar.monthrange(counter.year, counter.month)[1]
     
        # First iteration starts from start.day not 1
        if counter.month == start.month and counter.year == start.year:
            chunkStart = datetime(year=counter.year, month=counter.month, day=start.day)
        else:
            chunkStart = datetime(year=counter.year, month=counter.month, day=1)
     
        # Laster iteration ends on end.day not maxDay
        if counter.month == end.month and counter.year == end.year:
            chunkEnd = datetime(year=counter.year, month=counter.month, day=end.day)
        else:
            chunkEnd = datetime(year=counter.year, month=counter.month, day=maxDay)  
     
        # Increase counter by one month
        counter += timedelta(days=maxDay)
     
        print chunkStart.date(), chunkEnd.date()
     
    print
    print end
    produisant :



    résolu!

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    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 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Citation Envoyé par Michael REMY Voir le message
    ne pas utiliser cette solution car elle a un ptit bug étrange que je n'arrive pas à résoudre.
    Après si vous voulez débugger le code d'Alex Harvey, regardez comment il gère la variable "current" qui sert de contrôle à la boucle.
    Il a écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        # Increase counter by one month
        counter += timedelta(days=maxDay)
    => en commençant avec 15/05/2014, les suivants seront ~15/06/..., ~15/07/...
    Lorsque end est une date du mois, çà sautera le dernier mois lorsque le jour sera < date de début, le dernier mois saute.

    Mais la solution que je vous ai proposé fonctionne.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/08/2009, 18h47
  2. Récupérer le nom du mois à partir d'une date.
    Par zooffy dans le forum ASP.NET
    Réponses: 10
    Dernier message: 04/03/2008, 14h48
  3. Récupérer le mois à partir d'une date
    Par dessinateurttuyen dans le forum Débuter
    Réponses: 5
    Dernier message: 01/03/2008, 12h10
  4. [ACCESS] Nom du mois à partir d'une date
    Par leloup84 dans le forum Access
    Réponses: 12
    Dernier message: 05/04/2007, 14h41
  5. Réponses: 2
    Dernier message: 05/12/2006, 18h12

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