Pregunta Fecha python del mes anterior


Estoy tratando de obtener la fecha del mes anterior con Python. Esto es lo que he intentado:

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

Sin embargo, esta forma es mala por dos razones: primero devuelve 20122 para febrero de 2012 (en lugar de 201202) y, en segundo lugar, devolverá 0 en lugar de 12 en enero.

He resuelto este problema en bash con

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

Creo que si bash tiene una forma incorporada para este propósito, entonces python, mucho más equipado, debería proporcionar algo mejor que forzar a escribir el propio guión para lograr este objetivo. Por supuesto que podría hacer algo como:

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)

No he probado este código y no quiero usarlo de todos modos (a menos que no pueda encontrarlo de otra manera: /)

¡Gracias por tu ayuda!


74
2018-03-15 17:22


origen


Respuestas:


fecha y hora y las clases datetime.timedelta son tus amigos.

  1. encontrar hoy.
  2. usa eso para encontrar el primer día de este mes.
  3. utilice timedelta para realizar una copia de seguridad un solo día, hasta el último día del mes anterior.
  4. imprime la cadena YYYYMM que estás buscando.

Me gusta esto:

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

179
2018-03-15 17:35



Deberías usar dateutil. Con eso, puedes usar relativedelta, es una versión mejorada 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

41
2018-03-15 17:35



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

O:

from datetime import date, timedelta

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

37
2017-11-02 16:41



Sobre la base de la respuesta 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'))

5
2018-05-09 14:41



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))

2
2017-10-29 11:34



Es muy fácil y simple. Hacer esto

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()

Aquí está el resultado: $ 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

2
2017-09-02 06:40



Solo por diversión, una respuesta matemática pura usando divmod. Bastante ineficiente debido a la multiplicación, podría hacer tan bien un simple control sobre el número de meses (si es igual a 12, aumentar el año, 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
2017-08-28 22:01



Construyendo el comentario de @ J.F. Sebastian, puedes encadenar replace() función para volver un "mes". Como un mes no es un período de tiempo constante, esta solución intenta volver a la misma fecha del mes anterior, lo que por supuesto no funciona en todos los meses. En tal caso, este algoritmo se predetermina al último día del mes anterior.

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))

Salida:

one_month_ago: 2012-02-29 00:00:00

0
2017-07-15 22:18



Esto funcionó para mí:

import datetime
today = datetime.date.today()
last_month = today.replace(month=today.month-1, day=1)

0
2018-04-19 17:46