Дата 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)
Я не тестировал этот код, и я все равно не хочу его использовать (если я не могу найти другой способ:/)
Спасибо за вашу помощь!
Ответы
Ответ 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)