дата питона предыдущего месяца - PullRequest
100 голосов
/ 15 марта 2012

Я пытаюсь получить дату предыдущего месяца с помощью 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, гораздо более оснащенный, должен обеспечить что-то лучшее, чем принуждение к написанию собственного сценария для достижения этой цели. Конечно, я мог бы сделать что-то вроде:

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)

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

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

Ответы [ 11 ]

227 голосов
/ 15 марта 2012

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
 >>>
54 голосов
/ 15 марта 2012

Вы должны использовать dateutil . С этим вы можете использовать относительную дельта, это улучшенная версия таймделты.

>>> 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
42 голосов
/ 02 ноября 2012
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
6 голосов
/ 09 мая 2012

Опираясь на ответ 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 голосов
/ 02 сентября 2016

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

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
3 голосов
/ 29 октября 2015
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))
1 голос
/ 22 марта 2019

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

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
1 голос
/ 29 августа 2013

Просто для удовольствия, чисто математический ответ с использованием 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
0 голосов
/ 25 июня 2019

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

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

0 голосов
/ 19 апреля 2017

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

import datetime
today = datetime.date.today()
last_month = today.replace(month=today.month-1, day=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...