Converting string 'yyyy-mm-dd' into datetime

118,604

Solution 1

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)

Solution 2

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

Solution 3

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.

Solution 4

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)
Share:
118,604
Udaya Tenneti
Author by

Udaya Tenneti

Updated on September 11, 2021

Comments

  • Udaya Tenneti
    Udaya Tenneti over 2 years

    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"

  • Udaya Tenneti
    Udaya Tenneti about 9 years
    do you know how i could get the last business day of the month?
  • Udaya Tenneti
    Udaya Tenneti about 9 years
    do you know how i could get the last business day of the month?
  • Udaya Tenneti
    Udaya Tenneti about 9 years
    do you know how i could get the last business day of the month?
  • Tenzin
    Tenzin about 9 years
    Adding another example.
  • tommy.carstensen
    tommy.carstensen about 9 years
    @udaya-tenneti You could ask another question.
  • chucksmash
    chucksmash about 9 years
    @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.
  • A.J. Uppal
    A.J. Uppal about 9 years
    @tommy.carstensen agreed. Please don't combine multiple questions into one post.