J'ai une entrée brute de l'utilisateur telle que "2015-01-30" ... pour la requête que j'utilise, la date doit être entrée sous la forme d'une chaîne telle que "aaaa-mm-jj".
Je voudrais incrémenter la date de 1 mois à la fin de ma boucle du "2015-01-30" à "2015-02-27" (idéalement le dernier jour ouvrable du mois suivant). J'espérais que quelqu'un pourrait m'aider; J'utilise PYTHON, la raison pour laquelle je veux convertir en date-heure est que j'ai trouvé une fonction pour ajouter 1 mois.
Idéalement, mes deux questions à résoudre sont (en Python):
1) comment convertir la chaîne "aaaa-mm-jj" en une date/heure python et la reconvertir en chaîne après l'application d'une fonction timedelta
2) ET/ou comment ajouter 1 mois à la chaîne "aaaa-mm-jj"
Vous pouvez utiliser une ligne, qui prend la datetime
, ajoute un mois (à l'aide d'une fonction définie) et est reconvertie en chaîne:
x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d")
>>> import datetime, calendar
>>> x = "2015-01-30"
>>> x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d")
>>> x
'2015-02-28'
>>>
add_months
:
def add_months(sourcedate,months):
month = sourcedate.month - 1 + months
year = sourcedate.year + month / 12
month = month % 12 + 1
day = min(sourcedate.day,calendar.monthrange(year,month)[1])
return datetime.date(year,month,day)
Peut-être que ces exemples vous aideront à vous faire une idée:
from dateutil.relativedelta import relativedelta
import datetime
date1 = datetime.datetime.strptime("2015-01-30", "%Y-%m-%d").strftime("%d-%m-%Y")
print(date1)
today = datetime.date.today()
print(today)
addMonths = relativedelta(months=3)
future = today + addMonths
print(future)
Si vous importez datetime, vous aurez plus d'options pour gérer les variables de date et d'heure.
Dans mon exemple ci-dessus, j'ai un exemple de code qui va vous montrer comment ça marche.
Il est également très utile si vous souhaitez par exemple ajouter un nombre x de jours, mois ou années à une certaine date.
Edit: Pour répondre à la question ci-dessous, je vous suggère de regarder "calendrier"
Par exemple:
import calendar
january2012 = calendar.monthrange(2002,1)
print(january2012)
february2008 = calendar.monthrange(2008,2)
print(february2008)
Cela vous renvoie le premier jour ouvrable du mois et le nombre de jours du mois.
Avec cela, vous pouvez calculer quel était le dernier jour ouvrable du mois.
Voici plus d'informations à ce sujet: Link
J'ai aussi un coin ici, regarde ce que tu pourrais utiliser: Link
datetime
/date
pythonfrom datetime import date
date_string = '2015-01-30'
now = date(*map(int, date_string.split('-')))
# or now = datetime.strptime(date_string, '%Y-%m-%d').date()
from datetime import timedelta
DAY = timedelta(1)
last_bday = (now.replace(day=1) + 2*31*DAY).replace(day=1) - DAY
while last_bday.weekday() > 4: # Sat, Sun
last_bday -= DAY
print(last_bday)
# -> 2015-02-27
Cela ne prend pas en compte les vacances.
Pour convertir une chaîne de ce format en un objet de date Python:
In [1]: import datetime
In [2]: t = "2015-01-30"
In [3]: d = datetime.date(*(int(s) for s in t.split('-')))
In [4]: d
Out[4]: datetime.date(2015, 1, 30)
Pour avancer au dernier jour du mois prochain:
In [4]: d
Out[4]: datetime.date(2015, 1, 30)
In [5]: new_month = (d.month + 1) if d.month != 12 else 1
In [6]: new_year = d.year if d.month != 12 else d.year + 1
In [7]: import calendar
In [8]: new_day = calendar.monthrange(new_year, new_month)[1]
In [9]: d = d.replace(year=new_year,month=new_month,day=new_day)
In [10]: d
Out[10]: datetime.date(2015, 2, 28)
Et cet objet datetime.date
peut être facilement converti en chaîne 'AAAA-MM-JJ':
In [11]: str(d)
Out[11]: '2015-02-28'
MODIFIER:
Pour obtenir le dernier jour ouvrable du mois (lundi à vendredi):
In [8]: new_day = calendar.monthrange(new_year, new_month)[1]
In [9]: d = d.replace(year=new_year,month=new_month,day=new_day)
In [10]: day_of_the_week = d.isoweekday()
In [11]: if day_of_the_week > 5:
....: adj_new_day = new_day - (day_of_the_week - 5)
....: d = d.replace(day=adj_new_day)
....:
In [11]: d
Out[11]: datetime.date(2015, 2, 27)