Как получить номер недели в Python? - программирование
Подтвердить что ты не робот

Как получить номер недели в Python?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы можете получить номер недели непосредственно из 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

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

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

Ответ 3

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

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

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

Ответ 5

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

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

>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24

Ответ 6

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

from datetime import *
today = datetime.today()
print today.strftime("%U")

Ответ 7

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

import datetime
datetime.datetime.utcnow().isocalendar()[1]

Ответ 8

Если вы используете только номер недели 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 года содержит четверг, так что это неделя 1 с помощью isocalendar и создание date недели 2.

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

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 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

Ответ 9

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

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

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

Ответ 11

isocalendar() возвращает неверные значения года и недели для некоторых дат:

Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime as dt
>>> myDateTime = dt.datetime.strptime("20141229T000000.000Z",'%Y%m%dT%H%M%S.%fZ')
>>> yr,weekNumber,weekDay = myDateTime.isocalendar()
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2015, weekNumber is 1

Сравните с подходом Марка Рэнсом:

>>> yr = myDateTime.year
>>> weekNumber = ((myDateTime - dt.datetime(yr,1,1)).days/7) + 1
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2014, weekNumber is 52

Ответ 12

Я обобщаю обсуждение на два этапа:

  • Преобразовать необработанный формат в объект datetime.
  • Используйте функцию объекта datetime или объекта date для вычисления номера недели.

Разминка

`` `питона

from datetime import datetime, date, time
d = date(2005, 7, 14)
t = time(12, 30)
dt = datetime.combine(d, t)
print(dt)

`` `

1-й шаг

Чтобы вручную создать объект datetime, мы можем использовать datetime.datetime(2017,5,3) или datetime.datetime.now().

Но на самом деле нам обычно нужно разбирать существующую строку. мы можем использовать функцию strptime, такую ​​как datetime.strptime('2017-5-3','%Y-%m-%d'), в которой вы должны указать формат. Подробный код другого формата можно найти в официальной документации .

В качестве альтернативы более удобным способом является использование dateparse. Примерами являются dateparser.parse('16 Jun 2010'), dateparser.parse('12/2/12') или dateparser.parse('2017-5-3')

Вышеуказанные два подхода вернут объект datetime.

2-й шаг

Используйте полученный объект datetime для вызова strptime(format). Например,

`` `питона

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object. This day is Sunday
print(dt.strftime("%W")) # '00' Monday as the 1st day of the week. All days in a new year preceding the 1st Monday are considered to be in week 0.
print(dt.strftime("%U")) # '01' Sunday as the 1st day of the week. All days in a new year preceding the 1st Sunday are considered to be in week 0.
print(dt.strftime("%V")) # '52' Monday as the 1st day of the week. Week 01 is the week containing Jan 4.

`` `

Очень сложно определить, какой формат использовать. Лучше всего получить объект date для вызова isocalendar(). Например,

`` `питона

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object
d = dt.date() # convert to a date object. equivalent to d = date(2017,1,1), but date.strptime() don't have the parse function
year, week, weekday = d.isocalendar() 
print(year, week, weekday) # (2016,52,7) in the ISO standard

`` `

В действительности вы с большей вероятностью будете использовать date.isocalendar() для подготовки еженедельного отчета, особенно в сезон покупок "Рождество-Новый год".

Ответ 13

userInput = input ("Please enter project deadline date (dd/mm/yyyy/): ")

import datetime

currentDate = datetime.datetime.today()

testVar = datetime.datetime.strptime(userInput ,"%d/%b/%Y").date()

remainDays = testVar - currentDate.date()

remainWeeks = (remainDays.days / 7.0) + 1


print ("Please pay attention for deadline of project X in days and weeks are  : " ,(remainDays) , "and" ,(remainWeeks) , "Weeks ,\nSo  hurryup.............!!!") 

Ответ 14

Есть много систем для недельной нумерации. Ниже приведены наиболее распространенные системы, которые просто приведены с примерами кода:

  • ISO: первая неделя начинается с понедельника и должна содержать 4 января. Календарь ISO уже реализован на Python:

    >>> from datetime import date
    >>> date(2014, 12, 29).isocalendar()[:2]
    (2015, 1)
    
  • Северная Америка: первая неделя начинается с воскресенья и должна содержать 1 января. Следующий код - моя модифицированная версия реализации календаря Python ISO для системы в Северной Америке:

    from datetime import date
    
    def week_from_date(date_object):
        date_ordinal = date_object.toordinal()
        year = date_object.year
        week = ((date_ordinal - _week1_start_ordinal(year)) // 7) + 1
        if week >= 52:
            if date_ordinal >= _week1_start_ordinal(year + 1):
                year += 1
                week = 1
        return year, week
    
    def _week1_start_ordinal(year):
        jan1 = date(year, 1, 1)
        jan1_ordinal = jan1.toordinal()
        jan1_weekday = jan1.weekday()
        week1_start_ordinal = jan1_ordinal - ((jan1_weekday + 1) % 7)
        return week1_start_ordinal
    
    >>> from datetime import date
    >>> week_from_date(date(2014, 12, 29))
    (2015, 1)
    
  • MMWR (CDC): первая неделя начинается с воскресенья и должна содержать 4 января. Я создал пакет epiweeks специально для этой системы нумерации. Вот пример:
    >>> from datetime import date
    >>> from epiweeks import Week
    >>> Week.fromdate(date(2014, 12, 29))
    (2014, 53)
    

Ответ 15

На сегодняшний день:

import datetime as date
weeknumber = date.today().isocalendar()[1]