49

I have a raw input from the user such as "2015-01-30"...for the query I am using, the date has to be inputed as a string as such "yyyy-mm-dd".

I would like to increment the date by 1 month at end of my loop s.t "2015-01-30" becomes "2015-02-27" (ideally the last business day of the next month). I was hoping someone could help me; I am using PYTHON, the reason I want to convert to datetime is I found a function to add 1 month.

Ideally my two questions to be answered are (in Python):

1) how to convert string "yyyy-mm-dd" into a python datetime and convert back into string after applying a timedelta function

2) AND/or how to add 1 month to string "yyyy-mm-dd"

4
  • 2
    Please ask only one question per question. The first question is answered here. Commented Apr 21, 2015 at 17:29
  • 2
    The quick answer is: datetime.datetime.strptime(string, "%Y-%m-%d").date() Commented Apr 8, 2021 at 0:52
  • 2
    Second quick answer: date.fromisoformat('2019-12-04') (docs) Commented Aug 16, 2023 at 16:02
  • 1
    These answers are old ones. Apparently, specifically for the "YYYY-mm-dd" format, fromisoformat() and isoformat() suggested by @Flimm are the neat answers for now. Commented Oct 21, 2024 at 9:46

4 Answers 4

39

Maybe these examples will help you get an idea:

from dateutil.relativedelta import relativedelta
import datetime

date1 = datetime.datetime.strptime("2015-01-30", "%Y-%m-%d").strftime("%d-%m-%Y")
print(date1)

today = datetime.date.today()
print(today)
addMonths = relativedelta(months=3)
future = today + addMonths
print(future) 

If you import datetime it will give you more options in managing date and time variables.
In my example above I have some example code that will show you how it works.

It is also very usefull if you would for example would like to add a x number of days, months or years to a certain date.

Edit: To answer you question below this post I would suggest you to look at "calendar"

For example:

import calendar 
january2012 = calendar.monthrange(2002,1)
print(january2012)
february2008 = calendar.monthrange(2008,2)
print(february2008)

This return you the first workday of the month, and the number of days of the month.
With that you can calculate what was the last workday of the month.
Here is more information about it: Link
Also have a loook here, looks what you might could use: Link

Sign up to request clarification or add additional context in comments.

2 Comments

do you know how i could get the last business day of the month?
Adding another example.
23

converting string 'yyyy-mm-dd' into datetime/date python

from datetime import date

date_string = '2015-01-30'
now = date(*map(int, date_string.split('-')))
# or now = datetime.strptime(date_string, '%Y-%m-%d').date()

the last business day of the next month

from datetime import timedelta

DAY = timedelta(1)
last_bday = (now.replace(day=1) + 2*31*DAY).replace(day=1) - DAY
while last_bday.weekday() > 4: # Sat, Sun
    last_bday -= DAY
print(last_bday)
# -> 2015-02-27

It doesn't take into account holidays.

Comments

10

You can use a one-liner, that takes the datetime, adds a month (using a defined function), and converts back to a string:

x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d")

>>> import datetime, calendar
>>> x = "2015-01-30"
>>> x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d")
>>> x
'2015-02-28'
>>> 

add_months:

def add_months(sourcedate,months):
    month = sourcedate.month - 1 + months
    year = sourcedate.year + month / 12
    month = month % 12 + 1
    day = min(sourcedate.day,calendar.monthrange(year,month)[1])
    return datetime.date(year,month,day)

3 Comments

do you know how i could get the last business day of the month?
@udaya-tenneti You could ask another question.
@tommy.carstensen agreed. Please don't combine multiple questions into one post.
1

To convert a string of that format into a Python date object:

In [1]: import datetime

In [2]: t = "2015-01-30"

In [3]: d = datetime.date(*(int(s) for s in t.split('-')))

In [4]: d
Out[4]: datetime.date(2015, 1, 30)

To move forward to the last day of next month:

In [4]: d
Out[4]: datetime.date(2015, 1, 30)

In [5]: new_month = (d.month + 1) if d.month != 12 else 1

In [6]: new_year = d.year if d.month != 12 else d.year + 1

In [7]: import calendar

In [8]: new_day = calendar.monthrange(new_year, new_month)[1]

In [9]: d = d.replace(year=new_year,month=new_month,day=new_day)

In [10]: d
Out[10]: datetime.date(2015, 2, 28)

And this datetime.date object can be easily converted to a 'YYYY-MM-DD' string:

In [11]: str(d)
Out[11]: '2015-02-28'

EDIT:

To get the last business day (i.e. Monday-Friday) of the month:

In [8]: new_day = calendar.monthrange(new_year, new_month)[1]

In [9]: d = d.replace(year=new_year,month=new_month,day=new_day)

In [10]: day_of_the_week = d.isoweekday()

In [11]: if day_of_the_week > 5:
   ....:     adj_new_day = new_day - (day_of_the_week - 5)
   ....:     d = d.replace(day=adj_new_day)
   ....:

In [11]: d
Out[11]: datetime.date(2015, 2, 27)

2 Comments

do you know how i could get the last business day of the month?
@UdayaTenneti As in the last Friday of the month or the last Friday/non-holiday of the month? I'll edit my answer to include the former; I imagine for the latter you'd need to either use a third party package or give yourself a way to specify holidays in your locale.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.