web-dev-qa-db-fra.com

conversion de la chaîne 'aaaa-mm-jj' en python datetime

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" 

11
Udaya Tenneti

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)
3
A.J. Uppal

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

11
Tenzin

conversion de la chaîne 'aaaa-mm-jj' en datetime/date python

from 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()

le dernier jour ouvrable du mois prochain

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.

10
jfs

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)
0
chucksmash