43

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"

codeforester
  • 39,467
  • 16
  • 112
  • 140
Udaya Tenneti
  • 433
  • 1
  • 4
  • 7
  • 2
    Please ask only one question per question. The first question is answered [here](https://stackoverflow.com/questions/466345/converting-string-into-datetime?rq=1). – wallyk Apr 21 '15 at 17:29
  • 2
    The quick answer is: `datetime.datetime.strptime(string, "%Y-%m-%d").date()` – Flimm Apr 08 '21 at 00:52
  • Second quick answer: `date.fromisoformat('2019-12-04')` ([docs](https://docs.python.org/3/library/datetime.html#datetime.date.fromisoformat)) – Flimm Aug 16 '23 at 16:02

4 Answers4

36

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

Tenzin
  • 2,415
  • 2
  • 23
  • 36
21

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.

jfs
  • 399,953
  • 195
  • 994
  • 1,670
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)
A.J. Uppal
  • 19,117
  • 6
  • 45
  • 76
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)
chucksmash
  • 5,777
  • 1
  • 32
  • 41
  • do you know how i could get the last business day of the month? – Udaya Tenneti Apr 21 '15 at 18:23
  • @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. – chucksmash Apr 21 '15 at 19:14