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?
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.
Peut être fait sur la même ligne
from datetime import datetime
datetime.today().replace(day=1)
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)
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
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
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)
Utilisez flèche .
import arrow
arrow.utcnow().span('month')[0]