如何在Python中获取周数?

时间:2010-04-08 14:35:53

标签: python datetime week-number

如何使用Python找出6月16日(wk24)当前年份的周数?

18 个答案:

答案 0 :(得分:327)

datetime.date有一个isocalendar()方法,它返回一个包含日历周的元组:

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

datetime.date.isocalendar()是一个实例方法,以给定日期实例的相应顺序返回包含年,周数和工作日的元组。

答案 1 :(得分:76)

您可以直接从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周是包含1月4日的一周。例如: 01 ,02,...,53

     

来自:datetime — Basic date and time types — Python 3.7.3 documentation

我从here发现了这件事。它在Python 2.7.6中对我有用

答案 2 :(得分:69)

我相信date.isocalendar()将成为答案。 This article解释了ISO 8601日历背后的数学原理。查看Python文档的datetime page的date.isocalendar()部分。

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

.isocalendar()返回一个带有(year,wk num,wk day)的3元组。 dt.isocalendar()[0]返回年份,dt.isocalendar()[1]返回周数,dt.isocalendar()[2]返回工作日。很简单。

答案 3 :(得分:26)

这是另一种选择:

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

答案 4 :(得分:19)

其他人建议的ISO周很好,但可能不符合您的需求。它假设每周从星期一开始,这导致在年初和年末出现一些有趣的异常。

如果你宁愿使用一个定义,即第1周始终是1月1日到1月7日,不管星期几,都要使用这样的推导:

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

答案 5 :(得分:16)

通常获取当前周数(从星期日开始):

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

答案 6 :(得分:12)

对于一年中瞬时周的整数值,请尝试:

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

答案 7 :(得分: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周是包含星期一的第一周。 isocalendar中的第1周是包含星期四的第一周。 2014年初的部分周包含星期四,因此isocalendar为第1周,第2周为date

如果我们想要获得格里高利周,我们将需要从isocalendar转换为Gregorian。这是一个简单的功能,可以解决这个问题。

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

答案 8 :(得分:6)

您可以尝试%W指令,如下所示:

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

'%W':一年中的周数(星期一作为一周的第一天)作为十进制数。在第一个星期一之前的新年中的所有日子被认为是在第0周。(00,01,...,53)

答案 9 :(得分:5)

答案 10 :(得分:2)

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

与Mark Ransom的方法比较:

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

答案 11 :(得分:2)

我将讨论总结为两个步骤:

  1. 将原始格式转换为count对象。
  2. 使用datetime对象或datetime对象的函数计算周数。
  3. 热身

    ```蟒

    date

    ```

    第一步

    要手动生成from datetime import datetime, date, time d = date(2005, 7, 14) t = time(12, 30) dt = datetime.combine(d, t) print(dt) 个对象,我们可以使用datetimedatetime.datetime(2017,5,3)

    但实际上,我们通常需要解析现有的字符串。我们可以使用datetime.datetime.now()函数,例如strptime,您必须在其中指定格式。可以在official documentation中找到不同格式代码的详细信息。

    或者,更方便的方法是使用dateparse模块。示例包括datetime.strptime('2017-5-3','%Y-%m-%d')dateparser.parse('16 Jun 2010')dateparser.parse('12/2/12')

    以上两种方法将返回dateparser.parse('2017-5-3')个对象。

    第二步

    使用获取的datetime对象来呼叫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 准备每周报告,尤其是在圣诞节 - 新年"购物季节。

答案 12 :(得分:1)

假设您需要将一周与当天的年份组合为一个字符串。

currency

您可能会收到类似 2021-28

的消息

答案 13 :(得分:0)

许多用于周编号的系统。以下是一些简单的带有代码示例的最常见系统:

  • ISO :第一周从星期一开始,必须包含1月4日。 ISO日历已经在Python中实现:

    >>> from datetime import date
    >>> date(2014, 12, 29).isocalendar()[:2]
    (2015, 1)
    
  • 北美:第一周从星期日开始,必须包含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):第一周从星期日开始,必须包含1月4日。我专门为此编号系统创建了epiweeks程序包。这是一个例子:
    >>> from datetime import date
    >>> from epiweeks import Week
    >>> Week.fromdate(date(2014, 12, 29))
    (2014, 53)
    

答案 14 :(得分:0)

如果您想更改一周的第一天,您可以使用 calendar module

import calendar
import datetime

calendar.setfirstweekday(calendar.WEDNESDAY)
isodate = datetime.datetime.strptime(sweek,"%Y-%m-%d").isocalendar()
week_of_year = isodate[1]

例如,计算从星期三开始的一周的冲刺次数:

def calculate_sprint(sweek):
    calendar.setfirstweekday(calendar.WEDNESDAY)
    isodate=datetime.datetime.strptime(sweek,"%Y-%m-%d").isocalendar()
    return "{year}-{month}".format(year=isodate[0], month=isodate[1])

calculate_sprint('2021-01-01')
>>>'2020-53'

答案 15 :(得分:0)

我们有一个类似的问题,我们想出了这个逻辑 我已经测试了 1 年的测试用例并且都通过了

import datetime


def week_of_month(dt):

    first_day = dt.replace(day=1)
    dom = dt.day
    if first_day.weekday() == 6:
        adjusted_dom = dom
    else:
        adjusted_dom = dom + first_day.weekday()
    if adjusted_dom % 7 == 0 and first_day.weekday() != 6:
       value = adjusted_dom / 7.0 + 1
    elif first_day.weekday() == 6 and adjusted_dom % 7 == 0 and adjusted_dom == 7:
        value = 1
    else:
        value = int(ceil(adjusted_dom / 7.0))

    return int(value)


year = 2020
month = 01
date = 01

date_value = datetime.datetime(year, month, date).date()
no = week_of_month(date_value)

答案 16 :(得分:0)

我发现这些是获取周数的最快方法;所有变体。

from datetime import datetime


dt = datetime(2021, 1, 3)  # Date is January 3rd (sunday), 2021, year starts with Friday

dt.strftime("%W")  # '00'; Monday is considered first day of week, Sunday is the last day of the week which started in the previous year
dt.stftime("%U")  # '01'; Sunday is considered first day of week
dt.strftime("%V")  # '53'; ISO week number; result is '53' since there is no Thursday in this year's part of the week

可以在 Python 文档中找到对 %V 的进一步说明:

<块引用>

ISO 年由 52 或 53 个整周组成,其中一周从星期一开始,到星期日结束。 ISO 年的第一周是包含星期四的一年中的第一个(公历)日历周。这称为第 1 周,该星期四的 ISO 年份与其公历年相同。

https://docs.python.org/3/library/datetime.html#datetime.date.isocalendar

注意:请记住,返回值是一个字符串,因此如果需要数字,请将结果传递给 int 构造函数。

答案 17 :(得分:-2)

给出了很多答案,但id喜欢添加到答案中。

如果您需要将星期显示为年/周样式(例如1953年-2019年第53周,2001年-2020年第1周等),则可以执行以下操作:

import datetime

year = datetime.datetime.now()
week_num = datetime.date(year.year, year.month, year.day).strftime("%V")
long_week_num = str(year.year)[0:2] + str(week_num)

将需要当前的年份和星期,而在撰写本文时,long_week_num将是:

>>> 2006