Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling months in python datetimes

I have a function which gets the start of the month before the datetime provided:

def get_start_of_previous_month(dt):
    '''
    Return the datetime corresponding to the start of the month
    before the provided datetime.
    '''
    target_month = (dt.month - 1)
    if target_month == 0:
        target_month = 12
    year_delta = (dt.month - 2) / 12
    target_year = dt.year + year_delta

    midnight = datetime.time.min
    target_date = datetime.date(target_year, target_month, 1)
    start_of_target_month = datetime.datetime.combine(target_date, midnight)
    return start_of_target_month

However, it seems very convoluted. Can anyone suggest a simpler way? I am using python 2.4.

like image 867
wrgrs Avatar asked Jul 01 '26 16:07

wrgrs


1 Answers

Use a timedelta(days=1) offset of the beginning of this month:

import datetime

def get_start_of_previous_month(dt):
    '''
    Return the datetime corresponding to the start of the month
    before the provided datetime.
    '''
    previous = dt.date().replace(day=1) - datetime.timedelta(days=1)
    return datetime.datetime.combine(previous.replace(day=1), datetime.time.min)

.replace(day=1) returns a new date that is at the start of the current month, after which subtracting a day is going to guarantee that we end up in the month before. Then we pull the same trick again to get the first day of that month.

Demo (on Python 2.4 to be sure):

>>> get_start_of_previous_month(datetime.datetime.now())
datetime.datetime(2013, 2, 1, 0, 0)
>>> get_start_of_previous_month(datetime.datetime(2013, 1, 21, 12, 23))
datetime.datetime(2012, 12, 1, 0, 0)
like image 156
Martijn Pieters Avatar answered Jul 03 '26 05:07

Martijn Pieters



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!