Python - Get Yesterday's date as a string in YYYY-MM-DD format

146,674

Solution 1

You Just need to subtract one day from today's date. In Python datetime.timedelta object lets you create specific spans of time as a timedelta object.

datetime.timedelta(1) gives you the duration of "one day" and is subtractable from a datetime object. After you subtracted the objects you can use datetime.strftime in order to convert the result --which is a date object-- to string format based on your format of choice:

>>> from datetime import datetime, timedelta
>>> yesterday = datetime.now() - timedelta(1)

>>> type(yesterday)                                                                                                                                                                                    
>>> datetime.datetime    

>>> datetime.strftime(yesterday, '%Y-%m-%d')
'2015-05-26'

Note that instead of calling the datetime.strftime function, you can also directly use strftime method of datetime objects:

>>> (datetime.now() - timedelta(1)).strftime('%Y-%m-%d')
'2015-05-26'

As a function:

from datetime import datetime, timedelta


def yesterday(frmt='%Y-%m-%d', string=True):
    yesterday = datetime.now() - timedelta(1)
    if string:
        return yesterday.strftime(frmt)
    return yesterday

example:

In [10]: yesterday()
Out[10]: '2022-05-13'

In [11]: yesterday(string=False)
Out[11]: datetime.datetime(2022, 5, 13, 12, 34, 31, 701270)

Solution 2

An alternative answer that uses today() method to calculate current date and then subtracts one using timedelta(). Rest of the steps remain the same.

https://docs.python.org/3.7/library/datetime.html#timedelta-objects

from datetime import date, timedelta
today = date.today()
yesterday = today - timedelta(days = 1)
print(today)
print(yesterday)

Output: 
2019-06-14
2019-06-13

Solution 3

>>> import datetime
>>> datetime.date.fromordinal(datetime.date.today().toordinal()-1).strftime("%F")
'2015-05-26'

Solution 4

Calling .isoformat() on a date object will give you YYYY-MM-DD

from datetime import date, timedelta
(date.today() - timedelta(1)).isoformat()

Solution 5

I'm trying to use only import datetime based on this answer.

import datetime

oneday = datetime.timedelta(days=1)
yesterday = datetime.date.today() - oneday
Share:
146,674
Jacob
Author by

Jacob

Head of BI @ HouseTrip. User of R, Python, MySQL, Excel, PowerPivot / DAX, Tableau.

Updated on November 20, 2021

Comments

  • Jacob
    Jacob over 2 years

    As an input to an API request I need to get yesterday's date as a string in the format YYYY-MM-DD. I have a working version which is:

    yesterday = datetime.date.fromordinal(datetime.date.today().toordinal()-1)
    report_date = str(yesterday.year) + \
       ('-' if len(str(yesterday.month)) == 2 else '-0') + str(yesterday.month) + \
       ('-' if len(str(yesterday.day)) == 2 else '-0') + str(yesterday.day)
    

    There must be a more elegant way to do this, interested for educational purposes as much as anything else!

  • Knight
    Knight almost 5 years
    TypeError: strftime() takes at most 1 argument (2 given)
  • Vijay
    Vijay over 4 years
    instead of strftime, you can also use isoformat()
  • Mazdak
    Mazdak over 4 years
    This answer is misleading. Note that you still have to convert your date objects to string. print function automatically prints the date in that format but that doesn't mean the objects are string and formatted that way!