Поиск первого дня месяца в python

Я пытаюсь найти первый день месяца в python с одним условием: если моя текущая дата прошла 25 числа месяца, то первая переменная даты будет содержать первую дату следующего месяца вместо текущего месяца. Я делаю следующее:

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)

Есть ли более чистый способ сделать это?

Ответ 1

Это проницательное решение.

import datetime 

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

В оригинальном примере кода стоит отметить, что использование timedelta(30) вызовет проблему, если вы тестируете последний день января. Вот почему я использую 7-дневную дельту.

Ответ 2

Может быть сделано на одной линии

from datetime import datetime

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

Ответ 3

Используйте 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)

Ответ 4

Да, сначала установите дату и время в начало текущего месяца.

Второе испытание, если текущий день дня > 25 и получить значение true/false. Если True, то добавьте один месяц к началу месяца datetime. Если false, используйте объект datetime со значением, установленным в начале месяца.

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

Ответ 5

Модуль стрелка будет управлять вами и удаляться от тонких ошибок, а также использовать более старые продукты.

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

В этом случае вам не нужно, например, учитывать различные длины месяцев. Здесь вывод из этого script.

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

Ответ 6

Используйте стрелку.

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

Ответ 7

Вы можете использовать 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)

Ответ 8

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)