дата python предыдущего месяца

Я пытаюсь получить дату предыдущего месяца с Python. Вот что я пробовал:

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

однако этот способ плох по 2 причинам: Во-первых, он возвращает 20122 за февраль 2012 года (вместо 201202), а во-вторых, он вернет 0 вместо 12 января.

я решил эту проблему в Баш с

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

Я думаю, что если bash имеет встроенный способ для этой цели, то python, гораздо более оборудованный, должен предоставить что-то лучшее чем заставлять писать собственный сценарий для достижения этой цели. Конечно, я мог бы сделать что-то вроде:

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)

Я не тестировал этот код, и я не хочу его использовать в любом случае (если я не могу найти другой способ:/)

Спасибо за вашу помощь!

9 ответов


datetime и datetime.timedelta классы ваш друг.

  1. найти сегодня.
  2. использовать это, чтобы найти первый день текущего месяца.
  3. использовать timedelta для резервного копирования одного дня, до последнего дня предыдущего месяца.
  4. распечатайте строку YYYYMM, которую вы ищете.

такой:

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

вы должны использовать dateutil. С этим вы можете использовать relativedelta, это улучшенная версия 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

или:

from datetime import date, timedelta

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

дом на ответ 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'))

его очень легко и просто. Сделай это!--3-->

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

вот вывод: $ 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

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

просто для удовольствия, чистый математический ответ с использованием divmod. Довольно inneficient из-за умножения, может сделать так же просто проверить количество месяцев (Если равно 12, увеличить год и т. д.)

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

это сработало для меня:

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

основываясь на комментарии @J. F. Sebastian, вы можете связать replace() функция для того чтобы пойти назад один "месяц". Поскольку месяц не является константой периода времени, это решение пытается вернуться к той же дате предыдущего месяца, что, конечно, не работает для всех месяцев. В этом случае по умолчанию используется последний день предыдущего месяца.

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

выход:

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