如何在 Python 中获取周数?

2025-01-09 08:47:00
admin
原创
118
摘要:问题描述:如何使用 Python 找出当前年份 6 月 16 日(wk24)是第几周?解决方案 1:datetime.date有一个isocalendar()方法,返回一个包含日历周的元组:>>> import datetime >>> datetime.date(2010...

问题描述:

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


解决方案 1:

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

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

datetime.date.isocalendar()是一个实例方法,返回一个包含给定日期实例的年份、周数和星期几的元组。

在 Python 3.9+ 中,isocalendar()返回一个带有字段的命名元组yearweek和,weekday这意味着您可以使用命名属性明确访问周数:

>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar().week
24

解决方案 2:

您可以直接从日期时间中获取周数作为字符串。

>>> 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 — 基本日期和时间类型 — Python 3.7.3 文档

我从这里发现了这一点。它在 Python 2.7.6 中对我有用

解决方案 3:

我相信date.isocalendar()这就是答案。本文解释了 ISO 8601 日历背后的数学原理。查看Python 文档datetime 页面的 date.isocalendar() 部分。

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

.isocalendar() 返回一个三元组,即 (year, wk num, wk day)。dt.isocalendar()[0]返回年份,dt.isocalendar()[1]返回周数,dt.isocalendar()[2]返回星期几。非常简单。

解决方案 4:

很多种星期编号系统。以下是最常见的系统,并附有代码示例:

  • 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包(也支持 ISO 系统)。以下是一个例子:

>>> from datetime import date
>>> from epiweeks import Week
>>> Week.fromdate(date(2014, 12, 29))
(2014, 53)

解决方案 5:

这是另一个选择:

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

打印24

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

解决方案 6:

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

如果您更愿意使用这样的定义:第 1 周始终是 1 月 1 日至 1 月 7 日,而不管是星期几,请使用如下推导方式:

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

解决方案 7:

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

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

解决方案 8:

要获取一年中瞬时周数的整数值,请尝试:

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

解决方案 9:

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

from datetime import datetime


dt = datetime(2021, 1, 3)  # Date is January 3rd 2021 (Sunday), 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.strftime("%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

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

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

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

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

解决方案 10:

如果您只全面使用等历周数,则以下内容应该足够了:

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 周是包含星期四的第一周。2014 年初的部分星期包含星期四,因此这是等历中的第 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

解决方案 11:

本星期:

import datetime as dt
dt.date.today().isocalendar().week

对于任何其他周,today()用替代date(year, month, day)

祝你过得愉快week

解决方案 12:

我将讨论概括为两个步骤:

  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)

第一步

要手动生成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对象。

第二步

使用获取的 datetime对象来调用strptime(format)。例如,

Python

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()。例如,

Python

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() 来准备每周报告,尤其是在Christmas-New Year购物季节。

解决方案 13:

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

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

'%W':一年中的周数(星期一为一周的第一天),以十进制数表示。新年中第一个星期一之前的所有日子都被视为第 0 周。(00、01、...、53)

解决方案 14:

对于 pandas 用户,如果您想获取一列周数:

df['weekofyear'] = df['Date'].dt.week

解决方案 15:

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

解决方案 16:

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

import datetime
year,week = datetime.date.today().isocalendar()[:2]
week_of_the_year = f"{year}-{week}"
print(week_of_the_year)

你可能会得到类似2021-28 的结果

解决方案 17:

如果您想更改一周的第一天,您可以使用日历模块。

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'

解决方案 18:

我们遇到了类似的问题,我们想出了这个逻辑,我已经测试了一年的测试用例并且全部通过

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)

解决方案 19:

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 ,
So  hurryup.............!!!") 

解决方案 20:

已经有很多答案了,但我想补充一些。

如果您需要以年/周样式显示星期(例如 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用