196 votes

python date du mois précédent

J'essaie d'obtenir la date du mois précédent avec python. Voici ce que j'ai essayé :

str( time.strftime('%Y') ) + str( int(time.strftime('%m'))-1 )

Cependant, cette méthode est mauvaise pour deux raisons : Premièrement, elle renvoie 20122 pour le mois de février de 2012 (au lieu de 201202) et deuxièmement, elle renvoie 0 au lieu de 12 pour le mois de janvier.

J'ai résolu ce problème en bash avec

echo $(date -d"3 month ago" "+%G%m%d")

Je pense que si bash a un moyen intégré pour ce but, alors python, beaucoup plus équipé, devrait fournir quelque chose de mieux que de forcer l'écriture de son propre script pour atteindre ce but. Bien sûr, je pourrais faire quelque chose comme :

if int(time.strftime('%m')) == 1:
    return '12'
else:
    if int(time.strftime('%m')) < 10:
        return '0'+str(time.strftime('%m')-1)
    else:
        return str(time.strftime('%m') -1)

Je n'ai pas testé ce code et je ne veux pas l'utiliser de toute façon (à moins que je ne trouve pas d'autre moyen :/)

Merci pour votre aide !

422voto

bgporter Points 11119

datetime et les classes datetime.timedelta sont vos amis.

  1. trouver aujourd'hui.
  2. Utilisez-le pour trouver le premier jour de ce mois.
  3. utiliser timedelta pour sauvegarder un seul jour, jusqu'au dernier jour du mois précédent.
  4. imprime la chaîne YYYYMM que vous recherchez.

Comme ça :

 import datetime
 today = datetime.date.today()
 first = today.replace(day=1)
 lastMonth = first - datetime.timedelta(days=1)
 print(lastMonth.strftime("%Y%m"))

201202 est imprimé.

34 votes

Vous pourriez utiliser .replace() méthode : datetime.utcnow().replace(day=1) - timedelta(days=1)

2 votes

Cool ! La méthode de remplacement m'a échappé.

1 votes

Vous pouvez également enchaîner les .replace() fonction. Faites-le une fois pour obtenir le dernier mois, puis refaites-le pour obtenir le jour que vous voulez. Premièrement : d = date.today() puis one_month_ago = (d.replace(day=1) - timedelta(days=1)).replace(day=d.day)

106voto

Dave Butler Points 83

Vous devez utiliser dateutil . Avec cela, vous pouvez utiliser relativedelta, c'est une version améliorée de timedelta.

>>> import datetime 
>>> import dateutil.relativedelta
>>> now = datetime.datetime.now()
>>> print now
2012-03-15 12:33:04.281248
>>> print now + dateutil.relativedelta.relativedelta(months=-1)
2012-02-15 12:33:04.281248

0 votes

Cela ne fonctionne pas pour le premier mois de l'année : >>> IllegalMonthError : mauvais numéro de mois -1 ; doit être 1-12

0 votes

@mtoloo Quelle version de dateutil ? Je n'ai pas ce problème, mais je vais ajouter une syntaxe alternative.

1 votes

Je préfère celle-ci car bien que @bgporter ait une très belle solution, la sienne ne fonctionne pas aussi bien pour la recherche du mois suivant.

52voto

Ivan Points 401
from datetime import date, timedelta

first_day_of_current_month = date.today().replace(day=1)
last_day_of_previous_month = first_day_of_current_month - timedelta(days=1)

print "Previous month:", last_day_of_previous_month.month

Ou :

from datetime import date, timedelta

prev = date.today().replace(day=1) - timedelta(days=1)
print prev.month

1 votes

Une partie de la solution... pour trouver le jour du mois dernier, ajoutez quelque chose comme ceci : day_previous_month = min(today.day, last_day_of_previous_month.day) pour éviter de dépasser le nombre de jours.

0 votes

une ligne formatée en YYYMM 'from datetime import date, timedelta ANOMES = (date.today().replace(day=1) - timedelta(days=1)).strftime("%Y%m")''

9voto

paragbaxi Points 663

Construire sur La réponse de bgporter .

def prev_month_range(when = None): 
    """Return (previous month's start date, previous month's end date)."""
    if not when:
        # Default to today.
        when = datetime.datetime.today()
    # Find previous month: https://stackoverflow.com/a/9725093/564514
    # Find today.
    first = datetime.date(day=1, month=when.month, year=when.year)
    # Use that to find the first day of this month.
    prev_month_end = first - datetime.timedelta(days=1)
    prev_month_start = datetime.date(day=1, month= prev_month_end.month, year= prev_month_end.year)
    # Return previous month's start and end dates in YY-MM-DD format.
    return (prev_month_start.strftime('%Y-%m-%d'), prev_month_end.strftime('%Y-%m-%d'))

1voto

Tiberiu Ichim Points 26

Juste pour le plaisir, une réponse purement mathématique utilisant divmod. Plutôt inefficace à cause de la multiplication, on pourrait tout aussi bien faire une simple vérification du nombre de mois (si égal à 12, augmenter l'année, etc).

year = today.year
month = today.month

nm = list(divmod(year * 12 + month + 1, 12))
if nm[1] == 0:
    nm[1] = 12
    nm[0] -= 1
pm = list(divmod(year * 12 + month - 1, 12))
if pm[1] == 0:
    pm[1] = 12
    pm[0] -= 1

next_month = nm
previous_month = pm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X