fecha de Python del mes anterior

5 minutos de lectura

fecha de Python del mes anterior
Felipe

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 2 razones: primero, devuelve 20122 para febrero de 2012 (en lugar de 201202) y, en segundo lugar, devuelve 0 en lugar de 12 de enero.

He resuelto este problema en bash con

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

Creo que si bash tiene una forma integrada para este propósito, entonces python, mucho más equipado, debería proporcionar algo mejor que obligar a escribir el propio script 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 encontrar otra forma:/)

¡Gracias por tu ayuda!

  • relacionado: ¿Cuál es la forma más sencilla de restar un mes de una fecha en Python?

    – jfs

    25 ago.

fecha de Python del mes anterior
portero

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

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

Como esto:

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

201202 está impreso.

  • podrías usar .replace() método: datetime.utcnow().replace(day=1) - timedelta(days=1)

    – jfs

    16 mar. 12 a las 6:43

  • ¡Frio! Me perdí el método de reemplazo.

    – bgporter

    16 mar. 12 a las 12:55

  • También puede encadenar el .replace() función. Hágalo una vez para obtener el último mes, luego hágalo de nuevo para obtener el día que desea. Primero: d = date.today() entonces one_month_ago = (d.replace(day=1) - timedelta(days=1)).replace(day=d.day)

    – Thane Plummer

    15 jul.

  • @JFSebastian Tienes razón, gracias por señalarlo. No parece haber una sola línea elegante para esto, ya que un “mes” no es un período de tiempo constante. Puedes hacer algo feo importando calendar y usando calendar.mdays[d.month-1] y más fealdad en un min() función en el 2do replace, pero parece no-Pythonic y no tiene en cuenta los casos de esquina. He actualizado mi respuesta a continuación usando try - except que da cuenta de todos los casos, aunque odio usar excepciones como parte de un algoritmo.

    – Thane Plummer

    16 jul.

  • vea la respuesta de Ivan y agregue: min(date.today().day, last_day_of_anterior_month.day)

    – michel.iamit

    20 feb. 16 a las 10:10

1641751787 652 fecha de Python del mes anterior
dave mayordomo

Deberías usar dateutil. Con eso, puedes usar la delta relativa, es una versión mejorada de la delta del tiempo.

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

  • No funciona durante el primer mes del año: >>> IllegalMonthError: número de mes incorrecto -1; debe ser 1-12

    – mtoloo

    16 ene.


  • Prefiero este porque si bien @bgporter tiene una solución muy buena, la suya no funciona tan bien para buscar el próximo mes.

    – Daniel F.

    03 oct.

  • @mtoloo Probablemente hayas escrito mal mes/mes

    – r_negro

    09 mar. 16 a las 10:00


  • @r_black Sí, tienes razón. Eso fue mi culpa. La solución dada aquí es correcta y no se necesita más verificación para el primer mes del año.

    – mtoloo

    18 mayo 2016 en 13:17

  • Tenga en cuenta que si la fecha del mes anterior no existe (p. ej., el 31 de octubre existe, pero el 31 de septiembre no existe),relativedelta utilizará el siguiente día anterior (p. ej., el 30 de septiembre)

    – lobi

    27 ago. 2020 a las 22:06

1641751787 431 fecha de Python del mes anterior
Iván

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

  • parte de la solución… para encontrar el día del mes pasado, agregue algo como esto: día_mes_anterior = min(hoy.día, último_día_del_mes_anterior.día) para evitar exceder la cantidad de días.

    – michel.iamit

    20 feb. 16 a las 10:09

fecha de Python del mes anterior
paragbaxi

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

1641751787 480 fecha de Python del mes anterior
Mahfuz

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

1641751787 159 fecha de Python del mes anterior
Gil Baggio

Simple, una sola línea:

import datetime as dt
previous_month = (dt.date.today().replace(day=1) - dt.timedelta(days=1)).month

1641751787 750 fecha de Python del mes anterior
evidenciar

Con el Péndulo biblioteca muy completa, tenemos la subtract método (y no “subStract”):

import pendulum
today = pendulum.datetime.today()  # 2020, january
lastmonth = today.subtract(months=1)
lastmonth.strftime('%Y%m')
# '201912'

Vemos que maneja años saltantes.

El equivalente inverso es add.

https://pendulum.eustace.io/docs/#suma-y-resta

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad