web-dev-qa-db-fra.com

trouver le premier jour du mois en python

J'essaie de trouver le premier jour du mois en python avec une condition: si ma date actuelle a dépassé le 25 du mois, la première variable de date tiendra la première date du mois suivant au lieu du mois actuel. Je fais ce qui suit:

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)

y a-t-il un moyen plus propre de le faire?

23
tkyass

C'est une solution simple. 

import datetime 

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

Une chose à noter avec l'exemple de code original est que l'utilisation de timedelta(30) causera un problème e si vous testez le dernier jour de janvier. C'est pourquoi j'utilise un delta de 7 jours.

30
andrew

Peut être fait sur la même ligne

from datetime import datetime

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

Utilisez 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)
5
lampslave

Oui, commencez par définir une date/heure au début du mois en cours.

Deuxième test si le jour de la date actuelle est supérieur à 25 et obtenez un résultat vrai/faux Si la valeur est True, ajoutez add un mois à l'objet datetime du début du mois. Si false, utilisez l'objet datetime avec la valeur définie au début du mois.

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
1
mba12

Le module arrow vous aidera à éviter les erreurs subtiles et à utiliser les produits plus anciens.

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

Dans ce cas, vous n'avez pas besoin de prendre en compte les différentes durées de mois, par exemple. Voici la sortie de ce script.

25-Feb-2017 01-Feb-2017
28-Feb-2017 01-Mar-2017
1
Bill Bell

Vous pouvez utiliser 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)
0
dtatarkin

Utilisez flèche .

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