S'il vous plaît, quel est le problème avec mon code:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Affichez "2013-01-01 00:00:00", merci.
Un numéro de semaine ne suffit pas pour générer une date; vous avez également besoin d'un jour de la semaine. Ajoutez une valeur par défaut:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)
Le modèle -1
et -%w
indique à l'analyseur de sélectionner le lundi de cette semaine. Cela produit:
2013-07-01 00:00:00
%W
utilise le lundi comme premier jour de la semaine. Bien que vous puissiez choisir votre propre jour de semaine, vous pouvez obtenir des résultats inattendus si vous vous en écartez.
Voir la section strftime()
et strptime()
comportement dans la documentation, note de bas de page 4:
Lorsqu'elles sont utilisées avec la
strptime()
méthode,%U
et%W
ne sont utilisées dans les calculs que lorsque le jour de la semaine et l'année sont spécifiés.
Notez que si votre numéro de semaine est une date de semaine ISO , vous voudrez l'utiliser à la %G-W%V-%u
place! Ces directives nécessitent Python 3.6 ou plus récent.
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
%G
(année pour la plus grande partie de la semaine) et%V
dans ce cas.Pour compléter les autres réponses - si vous utilisez des numéros de semaine ISO , cette chaîne est appropriée (pour obtenir le lundi d'un numéro de semaine ISO donné):
import datetime d = '2013-W26' r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u') print(r)
%G
,%V
,%u
Sont équivalents ISO de%Y
,%W
,%w
, de sorte que cette sortie:2013-06-24 00:00:00
Disponible en Python 3.6+; à partir de documents .
la source
Dans Python 3.8, il y a le pratique
datetime.date.fromisocalendar
:>>> from datetime import date >>> date.fromisocalendar(2020, 1, 1) # (year, week, day of week) datetime.date(2019, 12, 30, 0, 0)
Dans les anciennes versions de Python (3.7-), le calcul peut utiliser les informations de
datetime.date.isocalendar
pour déterminer la semaine des semaines conformes à ISO8601:from datetime import date, timedelta def monday_of_calenderweek(year, week): first = date(year, 1, 1) base = 1 if first.isocalendar()[1] == 1 else 8 return first + timedelta(days=base - first.isocalendar()[2] + 7 * (week - 1))
Les deux fonctionnent également avec
datetime.datetime
.la source
import datetime res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w") print res
L'ajout de 1 comme jour de la semaine donnera le début exact de la semaine en cours. L'ajout de timedelta (jours = 6) vous donnera le week-end.
datetime.datetime(2018, 7, 23)
la source
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
Si vous avez le nombre annuel de semaines, ajoutez simplement le nombre de semaines au premier jour de l'année.
>>> import datetime >>> from dateutil.relativedelta import relativedelta >>> week = 40 >>> year = 2019 >>> date = datetime.date(year,1,1)+relativedelta(weeks=+week) >>> date datetime.date(2019, 10, 8)
la source
Voici une fonction pratique comprenant le problème de la semaine zéro.
la source