Как получить номер недели в Python? - PullRequest
272 голосов
/ 08 апреля 2010

Как узнать, какой номер недели является текущим годом 16 июня (wk24) с Python?

Ответы [ 14 ]

332 голосов
/ 08 апреля 2010

datetime.date имеет метод isocalendar(), который возвращает кортеж, содержащий календарную неделю:

>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24

datetime.date.isocalendar () - это метод экземпляра, возвращающий кортеж, содержащий год, номер недели и день недели в соответствующем порядке для данного экземпляра даты.

79 голосов
/ 21 января 2015

Вы можете получить номер недели непосредственно из datetime в виде строки.

>>> import datetime
>>> datetime.date(2010, 6, 16).strftime("%V")
'24'

Также вы можете получить различные "типы" номера недели в году, изменив параметр strftime для:

%U - Номер недели в году (воскресенье - первый день недели) в виде десятичного числа с добавлением нуля. Все дни в новом году, предшествующем первому воскресенью, считаются неделей 0. Примеры: 00 , 01,…, 53

%W - номер недели в году ( понедельник в качестве первого дня недели) в виде десятичного числа. Все дни в новом году, предшествующем первому понедельнику, считаются неделей 0. Примеры: 00 , 01,…, 53

[...]

( Добавлено в Python 3.6, перенесено в некоторые дистрибутивы Python 2.7 ). Для удобства включены несколько дополнительных директив, не требуемых стандартом C89. Все эти параметры соответствуют значениям даты ISO 8601. Они могут быть недоступны на всех платформах при использовании с методом strftime().

[...]

%V - ISO 8601 неделя в виде десятичного числа с понедельником в качестве первого дня недели. Неделя 01 - это неделя, содержащая 4 января. Примеры: 01 , 02,…, 53

от: datetime & mdash; Основные типы даты и времени & mdash; Документация Python 3.7.3

Я узнал об этом из здесь . У меня это работало в Python 2.7.6

69 голосов
/ 08 апреля 2010

Я верю date.isocalendar() будет ответом. В этой статье объясняется математика, лежащая в основе календаря ISO 8601. Ознакомьтесь с частью date.isocalendar () datetime-страницы документации Python.

>>> dt = datetime.date(2010, 6, 16) 
>>> wk = dt.isocalendar()[1]
24

.isocalendar () возвращает 3-кортеж с (год, недельный номер, недельный день). dt.isocalendar()[0] возвращает год, dt.isocalendar()[1] возвращает номер недели, dt.isocalendar()[2] возвращает день недели. Просто, как может быть.

26 голосов
/ 08 апреля 2010

Вот еще один вариант:

import time
from time import gmtime, strftime
d = time.strptime("16 Jun 2010", "%d %b %Y")
print(strftime("%U", d))

который печатает 24.

См .: http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior

20 голосов
/ 09 апреля 2010

Неделя ISO, предложенная другими, - хорошая, но она может не соответствовать вашим потребностям.Предполагается, что каждая неделя начинается с понедельника, что приводит к некоторым интересным аномалиям в начале и конце года.

Если вы предпочитаете использовать определение, в котором говорится, что неделя 1 всегда 1 января - 7 января,независимо от дня недели используйте деривацию, подобную этой:

>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24
16 голосов
/ 09 марта 2011

Обычно для получения номера текущей недели (начинается с воскресенья):

from datetime import *
today = datetime.today()
print today.strftime("%U")
12 голосов
/ 05 февраля 2015

Для целочисленного значения текущей недели года попробуйте:

import datetime
datetime.datetime.utcnow().isocalendar()[1]
8 голосов
/ 17 сентября 2015

Если вы используете только номер недели isocalendar через доску, должно быть достаточно:

import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]

Возвращает второго члена кортежа, возвращенного isocalendar для номера нашей недели.

Однако, если вы собираетесь использовать функции даты, которые имеют дело с григорианским календарем, только isocalendar не будет работать! Возьмите следующий пример:

import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]

Строка здесь говорит, что мы должны вернуть понедельник первой недели 2014 года в качестве нашей даты. Когда мы используем isocalendar для получения номера недели здесь, мы ожидаем получить тот же номер недели назад, но мы этого не делаем. Вместо этого мы получаем номер недели 2. Почему?

Неделя 1 в григорианском календаре - это первая неделя с понедельником. Неделя 1 в isocalendar - это первая неделя, содержащая четверг. Неполная неделя в начале 2014 года содержит четверг, поэтому по isocalendar это неделя 1 и составляет date неделя 2.

Если мы хотим получить григорианскую неделю, нам нужно будет перейти с изокалендаря на григорианский. Вот простая функция, которая делает свое дело.

import datetime

def gregorian_week(date):
    # The isocalendar week for this date
    iso_week = date.isocalendar()[1]

    # The baseline Gregorian date for the beginning of our date's year
    base_greg = datetime.datetime.strptime('%d-1-1' % date.year, "%Y-%W-%w")

    # If the isocalendar week for this date is not 1, we need to 
    # decrement the iso_week by 1 to get the Gregorian week number
    return iso_week if base_greg.isocalendar()[1] == 1 else iso_week - 1
6 голосов
/ 31 мая 2016

Вы можете попробовать директиву% W, как показано ниже:

d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))

'% W': номер недели в году (понедельник - первый день недели) в виде десятичного числа. Все дни в новом году, предшествующем первому понедельнику, считаются неделей 0. (00, 01, ..., 53)

5 голосов
/ 08 апреля 2010

Посмотрите на datetime.datetime.isocalendar .

...