Подтвердить что ты не робот

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

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

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

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

Я решил эту проблему в bash с помощью

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

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

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)

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

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

4b9b3361

Ответ 1

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

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

Вот так:

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

Ответ 2

Вы должны использовать 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

Ответ 3

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

Ответ 4

На основе ответа bgporter.

def prev_month_range(when = None): 
    """Return (previous month start date, previous month end date)."""
    if not when:
        # Default to today.
        when = datetime.datetime.today()
    # Find previous month: /questions/99028/python-date-of-the-previous-month/631009#631009
    # 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 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

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

Ответ 6

Это очень легко и просто. Сделайте это

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

Ответ 7

Просто для удовольствия, чистый математический ответ с использованием divmod. Довольно непростой из-за умножения, можно было бы сделать также простую проверку количества месяцев (если оно равно 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

Ответ 8

Для тех, кто пришел сюда и хочет получить первый и последний день предыдущего месяца:

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)

Выход:

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

Ответ 9

Построение комментария @J.F. Себастьян, вы можете связать функцию 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

Ответ 10

Если вы хотите посмотреть буквы ASCII в файле типа EXE в среде LINUX/UNIX, попробуйте "od -c 'filename' | more"

Скорее всего, вы получите много неузнаваемых предметов, но все они будут представлены, и будут отображаться представления HEX, а эквивалентные символы ASCII (если это уместно) будут следовать за строкой шестнадцатеричных кодов. Попробуйте это на скомпилированном фрагменте кода, который вы знаете. Вы можете увидеть вещи в нем, вы узнаете.

Ответ 11

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

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