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

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

Ответы [ 14 ]

2 голосов
/ 04 мая 2017

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

  1. Преобразование необработанного формата в объект datetime.
  2. Используйте функцию объекта 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() для подготовки еженедельного отчета, особенно в сезон покупок "Рождество-Новый год".

2 голосов
/ 15 апреля 2014

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
0 голосов
/ 29 июня 2019

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

  • 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)
    
0 голосов
/ 20 сентября 2015
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.............!!!") 
...