J'essaie de trouver un format de date personnalisé comme YYYYW, par exemple. 201620 après soustraction d'un certain nombre de périodes d'une semaine.

Jusqu'à présent, j'ai pu convertir une chaîne de date comme YYYYW en date en utilisant le code suivant;

from datetime import datetime

myDate = "201642"
year = myDate[:4]
week = myDate[-2:]
day = '1'
myDate = year + " " + week + " " + day
print(myDate)
date = datetime.strptime(myDate, "%Y %W %w")
print(date)

Mais je suis incapable de trouver un moyen de soustraire par exemple. 43 semaines à partir de 201642 et obtenez un résultat comme 201552.

EDIT 1: En utilisant les suggestions des commentaires, voici la solution.

Depuis datetime import datetime depuis datetime import timedelta

myDate = "201642"
year = myDate[:4]
week = myDate[-2:]
day = '1'
myDate = year + " " + week + " " + day
print(myDate)
date = datetime.strptime(myDate, "%Y %W %w")
print(date)
new_date = date - timedelta(weeks=42)
str_new_date = datetime.strftime(new_date, '%Y%W')
print(str_new_date)
3
user6083088 13 avril 2018 à 06:33

3 réponses

Meilleure réponse

Autre que de faire les calculs vous-même, voici une tentative d'utilisation de datetime. Tout faire en utilisant les numéros de semaine ISO (en utilisant les méthodes de cette réponse):

>>> import datetime
>>> date = '201642'
>>> weeks = 43
>>> year = date[:4]
>>> week = date[4:]

>>> start = iso_to_gregorian(int(year), int(week), 1)
>>> start
datetime.date(2016, 10, 17)
>>> start.isocalendar()
(2016, 42, 1)
>>> offset_weeks = datetime.timedelta(weeks=43)
>>> end = start - offset_weeks
>>> end
datetime.date(2015, 12, 21)
>>> end.isocalendar()
(2015, 52, 1)
>>> '{}{}'.format(*end.isocalendar())
'201552'

Une version modifiée de la réponse de @ Hildy ci-dessous:

In [29]: start = datetime.datetime.strptime(date + '0', '%Y%W%w')

In [30]: start
Out[30]: datetime.datetime(2016, 10, 23, 0, 0)

In [31]: start.strftime('%Y%W')
Out[31]: '201642'

In [32]: end = start - datetime.timedelta(weeks=43)

In [33]: end
Out[33]: datetime.datetime(2015, 12, 27, 0, 0)

In [34]: end.strftime('%Y%W')
Out[34]: '201551'
2
Harvey 13 avril 2018 à 04:50

Vous n'avez pas réellement analysé correctement la date dans votre exemple de code, mais puisque vous dites que votre code réel le fait, ignorons cela.

Donc, vous avez un objet datetime. Vous voulez en soustraire 43 semaines. Tout ce que vous avez à faire est… exactement cela, en utilisant un {{X1} }:

>>> dt = datetime.datetime(2016, 10, 21)
>>> dt - datetime.timedelta(weeks=43)
datetime.datetime(2015, 12, 25, 0, 0)

Le résultat est à la même heure, le même jour de la semaine, 43 semaines plus tôt.


Mais il convient de noter que, pour l'heure locale, ce "même temps" pourrait être décalé d'une heure en raison du franchissement d'une frontière d'été. Et être absent d'une heure peut être particulièrement déroutant lorsque vous utilisez minuit. Il est donc généralement préférable d'utiliser les date objets au lieu d'objets datetime pour ce genre de travail:

>>> dt = datetime.datetime(2016, 10, 21)
>>> dt.date()
datetime.date(2016, 10, 21)
>>> dt.date() - datetime.timedelta(weeks=43)
datetime.date(2015, 12, 25)

Dans les deux cas, si vous souhaitez la reconvertir en une chaîne YYYYWW, datetime et date ont strftime méthodes pour cela:

>>> d2 = dt - datetime.timedelta(weeks=43)
>>> d2.strftime('%Y%W')
'201551'
2
abarnert 13 avril 2018 à 04:20

Cela peut être fait avec delta relatif, à partir de la bibliothèque dateutil; il convient de noter que cette bibliothèque fait partie de la bibliothèque standard en Python 2x, mais pas 3x ... vous devrez l'installer.

La prochaine chose que vous devez savoir est que, selon le docs, "Lorsqu'ils sont utilisés avec la méthode strptime (), %U et %W ne sont utilisés dans les calculs que lorsque le jour de la semaine et l'année sont spécifiés."

Essayez ceci:

from dateutil.relativedelta import relativedelta
from datetime import datetime

#I've added the day number here, as described in the docs
myDate = "2016042"
# with '%w' added, strptime() will work
date = datetime.strptime(myDate, "%Y%w%W")
# now use relativedelta() to do the date math
date = date - relativedelta(weeks=2)
# finally, use strftime() to return the date back to the format you like
myDate = date.strftime("%Y%W")

print(string_date)

Je l'ai utilisé dans les opérations ETL pour calculer des choses comme les exercices et cela fonctionne très bien. Comme indiqué par d'autres ici, timedelta() peut être utilisé d'une manière similaire.

2
Hildy 13 avril 2018 à 04:48