finding first day of the month in python

PythonDatetime

Python Problem Overview


I'm trying to find the first day of the month in python with one condition: if my current date passed the 25th of the month, then the first date variable will hold the first date of the next month instead of the current month. I'm doing the following:

import datetime 
todayDate = datetime.date.today()
if (todayDate - todayDate.replace(day=1)).days > 25:
    x= todayDate + datetime.timedelta(30)
    x.replace(day=1)
    print x
else:
    print todayDate.replace(day=1)

is there a cleaner way for doing this?

Python Solutions


Solution 1 - Python

Can be done on the same line using date.replace:

from datetime import datetime

datetime.today().replace(day=1)

Solution 2 - Python

This is a pithy solution.

import datetime 

todayDate = datetime.date.today()
if todayDate.day > 25:
    todayDate += datetime.timedelta(7)
print todayDate.replace(day=1)

One thing to note with the original code example is that using timedelta(30) will cause trouble if you are testing the last day of January. That is why I am using a 7-day delta.

Solution 3 - Python

Use dateutil.

from datetime import date
from dateutil.relativedelta import relativedelta

today = date.today()
first_day = today.replace(day=1)
if today.day > 25:
    print(first_day + relativedelta(months=1))
else:
    print(first_day)

Solution 4 - Python

from datetime import datetime

date_today = datetime.now()
month_first_day = date_today.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
print(month_first_day)

Solution 5 - Python

Use arrow.

import arrow
arrow.utcnow().span('month')[0]

Solution 6 - Python

This could be an alternative to Gustavo Eduardo Belduma's answer:

import datetime 
first_day_of_the_month = datetime.date.today().replace(day=1)

Solution 7 - Python

Yes, first set a datetime to the start of the current month.

Second test if current date day > 25 and get a true/false on that. If True then add add one month to the start of month datetime object. If false then use the datetime object with the value set to the beginning of the month.

import datetime 
from dateutil.relativedelta import relativedelta

todayDate = datetime.date.today()
resultDate = todayDate.replace(day=1)

if ((todayDate - resultDate).days > 25):
    resultDate = resultDate + relativedelta(months=1)
    
print resultDate

Solution 8 - Python

The arrow module will steer you around and away from subtle mistakes, and it's easier to use that older products.

import arrow

def cleanWay(oneDate):
	if currentDate.date().day > 25:
		return currentDate.replace(months=+1,day=1)
	else:
		return currentDate.replace(day=1)
		

currentDate = arrow.get('25-Feb-2017', 'DD-MMM-YYYY')
print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY'))

currentDate = arrow.get('28-Feb-2017', 'DD-MMM-YYYY')
print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY'))

In this case there is no need for you to consider the varying lengths of months, for instance. Here's the output from this script.

25-Feb-2017 01-Feb-2017
28-Feb-2017 01-Mar-2017

Solution 9 - Python

I found a clean way to do this is to create a datetime object using the month and year attributes of todayDate, with days set to 1 i.e.

import datetime 
todayDate = datetime.date.today()

firstOfMon = datetime.date(todayDate.year, todayDate.month, 1)

Solution 10 - Python

You can use dateutil.rrule:

In [1]: from dateutil.rrule import *

In [2]: rrule(DAILY, bymonthday=1)[0].date()
Out[2]: datetime.date(2018, 10, 1)

In [3]: rrule(DAILY, bymonthday=1)[1].date()
Out[3]: datetime.date(2018, 11, 1)

Solution 11 - Python

My solution to find the first and last day of the current month:

def find_current_month_last_day(today: datetime) -> datetime:
    if today.month == 2:
        return today.replace(day=28)

    if today.month in [4, 6, 9, 11]:
        return today.replace(day=30)

    return today.replace(day=31)


def current_month_first_and_last_days() -> tuple:
    today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
    first_date = today.replace(day=1)
    last_date = find_current_month_last_day(today)
    return first_date, last_date

Solution 12 - Python

First day of next month:

from datetime import datetime

class SomeClassName(models.Model):
    if datetime.now().month == 12:
        new_start_month = 1
    else:
        new_start_month = datetime.now().month + 1

Then we replace the month and the day

    start_date = models.DateField(default=datetime.today().replace(month=new_start_month, day=1, hour=0, minute=0, second=0, microsecond=0))

Solution 13 - Python

One-liner:

from datetime import datetime, timedelta
last_month=(datetime.now().replace(day=1) - timedelta(days=1)).replace(day=1)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontkyassView Question on Stackoverflow
Solution 1 - PythonGustavo Eduardo BeldumaView Answer on Stackoverflow
Solution 2 - PythonandrewView Answer on Stackoverflow
Solution 3 - PythonlampslaveView Answer on Stackoverflow
Solution 4 - PythonBalaji.J.BView Answer on Stackoverflow
Solution 5 - PythonImPerat0R_View Answer on Stackoverflow
Solution 6 - PythontjurkanView Answer on Stackoverflow
Solution 7 - Pythonmba12View Answer on Stackoverflow
Solution 8 - PythonBill BellView Answer on Stackoverflow
Solution 9 - PythonRichView Answer on Stackoverflow
Solution 10 - PythondtatarkinView Answer on Stackoverflow
Solution 11 - PythonmhyousefiView Answer on Stackoverflow
Solution 12 - PythonFernando ZunigaView Answer on Stackoverflow
Solution 13 - PythonJouberto FonsecaView Answer on Stackoverflow