pythonpython-2.7python-3.xdatedatetime

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


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!


Solution

  • 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 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)