web-dev-qa-db-fra.com

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, il renvoie 20122 pour le mois de février 2012 (au lieu de 201202) et deuxièmement, il renvoie 0 au lieu de 12 le janvier.

J'ai résolu ce problème à Bash avec

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

Je pense que si bash a un moyen intégré pour cela, alors python, bien plus équipé, devrait fournir quelque chose de mieux que de forcer l'écriture de son propre script pour atteindre cet objectif. 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 de votre aide!

101
philippe

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. utilisez timedelta pour sauvegarder un seul jour, jusqu'au dernier jour du mois précédent.
  4. imprimez la chaîne AAAAMM 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
 >>>
238
bgporter

Vous devriez 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
55
Dave Butler
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
43
Ivan

Construire sur 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'))
6
paragbaxi
def prev_month(date=datetime.datetime.today()):
    if date.month == 1:
        return date.replace(month=12,year=date.year-1)
    else:
        try:
            return date.replace(month=date.month-1)
        except ValueError:
            return prev_month(date=date.replace(day=date.day-1))
3
steve

C'est très facile et simple. Faire ceci

from dateutil.relativedelta import relativedelta
from datetime import datetime

today_date = datetime.today()
print "todays date time: %s" %today_date

one_month_ago = today_date - relativedelta(months=1)
print "one month ago date time: %s" % one_month_ago
print "one month ago date: %s" % one_month_ago.date()

Voici la sortie: $ python2.7 main.py

todays date time: 2016-09-06 02:13:01.937121
one month ago date time: 2016-08-06 02:13:01.937121
one month ago date: 2016-08-06
3
mahfuz110244

Pour quelqu'un qui est arrivé ici et qui cherche à obtenir le premier et le dernier jour du mois précédent:

from datetime import date, timedelta

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

start_day_of_prev_month = date.today().replace(day=1) - timedelta(days=last_day_of_prev_month.day)

# For printing results
print("First day of prev month:", start_day_of_prev_month)
print("Last day of prev month:", last_day_of_prev_month)

Sortie:

First day of prev month: 2019-02-01
Last day of prev month: 2019-02-28
2

Juste pour le plaisir, une réponse mathématique pure en utilisant divmod. Assez inutile en raison de la multiplication, pourrait aussi bien faire un simple contrôle sur le nombre de mois (si égal à 12, augmentation d'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
1
Tiberiu Ichim

Construire le commentaire de @ J.F. Sebastian, vous pouvez chaîner la fonction replace() pour revenir en arrière d'un "mois". Comme un mois n'est pas une période constante, cette solution tente de revenir à la même date le mois précédent, ce qui ne fonctionne bien sûr pas pour tous les mois. Dans un tel cas, cet algorithme utilise par défaut le dernier jour du mois précédent.

from datetime import datetime, timedelta

d = datetime(2012, 3, 31) # A problem date as an example

# last day of last month
one_month_ago = (d.replace(day=1) - timedelta(days=1))
try:
    # try to go back to same day last month
    one_month_ago = one_month_ago.replace(day=d.day)
except ValueError:
    pass
print("one_month_ago: {0}".format(one_month_ago))

Sortie:

one_month_ago: 2012-02-29 00:00:00
0
Thane Plummer

Si vous souhaitez consulter les lettres ASCII dans un fichier de type EXE dans un environnement LINUX/UNIX, essayez "od -c 'nom_fichier' | plus".

Vous obtiendrez probablement un grand nombre d'éléments non reconnaissables, mais ils seront tous présentés et les représentations HEX seront affichées, et les caractères ASCII équivalents (le cas échéant) suivront la ligne de codes hexadécimaux. Essayez-le sur un morceau de code compilé que vous connaissez. Vous pouvez y voir des choses que vous reconnaissez.

0
Rick