Ravi
Ravi

Reputation: 667

How to get a specific date from the previous month given the current date in python?

I want to get the 20th of previous month, given the current_date() I am trying to use time.strftime but not able to subtract the value from it.

timestr = time.strftime("%Y-(%m-1)%d")

This is giving me error. The expected output is 2019-03-20 if my current_date is in April. Not sure how to go about it.

I read the posts from SO and most of them address getting the first day / last day of the month. Any help would be appreciated.

Upvotes: -1

Views: 1430

Answers (6)

Thomas
Thomas

Reputation: 10065

You could use datetime, dateutil or arrow to find the 20th day of the previous month. See examples below.


Using datetime:

from datetime import date

d = date.today()

month, year = (d.month-1, d.year) if d.month != 1 else (12, d.year-1)

last_month = d.replace(day=20, month=month, year=year)

print(last_month)

Using datetime and timedelta:

from datetime import date
from datetime import timedelta

d = date.today()

last_month = (d - timedelta(days=d.day)).replace(day=20)

print(last_month)

Using datetime and dateutil:

from datetime import date
from dateutil.relativedelta import relativedelta  # pip install python-dateutil

d = date.today()

last_month = d.replace(day=20) - relativedelta(months=1)

print(last_month)

Using arrow:

import arrow  # pip install arrow

d = arrow.now()

last_month = d.shift(months=-1).replace(day=20).datetime.date()

print(last_month)

Upvotes: 0

Jab
Jab

Reputation: 27485

Use datetime.replace

import datetime

current_date = datetime.date.today()
new_date = current_date.replace(
  month = current_date.month - 1,
  day = 20
)

print(new_date)
#2019-03-20

Edit

That won't work for Jan so this is a workaround:

import datetime

current_date = datetime.date(2019, 2, 17)
month = current_date.month - 1
year = current_date.year
if not month:
  month, year = 12, year - 1

new_date = datetime.date(year=year, month=month, day=20)

Upvotes: 1

krethika
krethika

Reputation: 4476

It is not possible to do math inside a string passed to time.strftime, but you can do something similar to what you're asking very easily using the time module

in Python 3

# Last month
t = time.gmtime()
print(f"{t.tm_year}-{t.tm_mon-1}-20")

or in Python 2

print("{0}-{1}-{2}".format(t.tm_year, t.tm_mon -1, 20))

If you have fewer constraints, you can just use the datetime module instead.

Upvotes: 0

Reedinationer
Reedinationer

Reputation: 5774

I imagine it is the way dates are parsed. It is my understanding that with your code it is looking for

2019-(03-1)20 or 2019-(12-1)15, etc..

Because the %y is not a variable, but a message about how the date is to be expected within a string of text, and other characters are what should be expected, but not processed (like "-")

This seems entirely not what you are going for. I would just parse the date like normal and then reformat it to be a month earlier:

import datetime
time = datetime.datetime.today()
print(time)
timestr = time.strftime("%Y-%m-%d")
year, month, day = timestr.split("-")
print("{}-{}-{}".format(year, int(month)-1, day))

This would be easier with timedelta objects, but sadly there isn't one for months, because they are of various lengths.

To be more robust if a new year is involved:

import datetime
time = datetime.datetime.today()
print(time)
timestr = time.strftime("%Y-%m-%d")
year, month, day = timestr.split("-")
if month in [1, "01", "1"]: # I don't remember how January is represented
    print("{}-{}-{}".format(int(year) - 1, 12, day)) # use December of last year
else:
    print("{}-{}-{}".format(year, int(month)-1, day))

Upvotes: 1

ashishmishra
ashishmishra

Reputation: 389

This will help:

from datetime import date, timedelta

dt = date.today() - timedelta(30)// timedelta(days No.)
print('Current Date :',date.today())
print(dt)

Upvotes: -1

David Robles
David Robles

Reputation: 9607

from datetime import date, timedelta
today = date.today()
last_day_prev_month = today - timedelta(days=today.day)
twenty_prev_month = last_day_prev_month.replace(day=20)
print(twenty_prev_month)  # 2019-03-20

Upvotes: 4

Related Questions