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.
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.
Réponses:
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 .
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
.
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)
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)
Voici une fonction pratique comprenant le problème de la semaine zéro.