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!
datetime et les classes datetime.timedelta sont vos amis.
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
>>>
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
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
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'))
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))
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
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
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
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
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.