【问题标题】:How to find all week numbers that are first week of month in a year python如何找到一年中第一周的所有周数python
【发布时间】:2017-12-07 22:20:22
【问题描述】:

我想在每月第一周的星期日创建一个活动。

这是我为特定周数所做的事情,即june 的第一周以获取日期:

from datetime import datetime
myDate = "2017 22 0"
# here `2017` is year, `22` is week number and `0` =sunday is week day
datetime.strptime(myDate, "%Y %W %w")

#output...
datetime.datetime(2017, 6, 4, 0, 0)

所以我需要一个包含每个月第一周的所有周数的列表,这样我就可以循环访问它并获得想要的日期。

添加更多信息

我想要一种方法,它返回月份第一周的周数列表,其中第一周意味着周有第一个星期日。

def get_week_number(year=2017, day=0):
   #day 0 means sunday
   ...
   ...
   return [1, 5, 9, 13, 18, 22, ...]  

【问题讨论】:

  • 如何定义一个月的第一周?第一天是哪一周?每月有 4 天或更多天的第一周?第一个星期日是哪一周?还有什么?
  • @RuuddeJong 第一个星期日的那一周。
  • 对于周数也有歧义,因为您需要定义一年中的第一周是什么。你必须定义一周从哪一天开始。有不同的约定。在欧洲并根据 ISO 标准,例如一周从星期一开始。据我所知,在美国,一周通常从星期日开始。一年中的第一周也可以通过多种方式定义。最常见的有:1 月 1 日所在的那一周、第一个星期四所在的那一周(ISO 标准)或第一个完整的一周。
  • 一旦你决定了一年中的第一周是什么时候,你可以简单地将一个月的第一个星期日和一年的第一周开始之间的timedelta除以7 获得周数(但要注意一次性)。

标签: python django date time calendar


【解决方案1】:

(已编辑,因为工作日编号错误)

>>> import datetime
>>> june1 = datetime.datetime(2017,6,1)
>>> june1
datetime.datetime(2017, 6, 1, 0, 0)
>>> june1_weekday = june1.weekday()
>>> if june1_weekday < 6:  # 6 indicates Sunday
        first_sunday_in_june = june1 + datetime.timedelta(days=6-june1_weekday)
else:
        first_sunday_in_june = june1


>>> print(first_sunday_in_june)
2017-06-04 00:00:00

假设您需要 ISO 周数,则可以使用 isocalendar() 方法。这给出了一个元组(year, weeknumber, weekday)。这使用了周从星期一开始的惯例,一年中的第一周是一年中至少有四天的第一周(或者换句话说,第一个星期四的那一周)。

>>> first_sunday_in_june.isocalendar()
(2017, 22, 7)

如果您对一周中的第一天或一年中的第一周有其他约定,则必须编写自己的函数来获取周数。

在几个月的循环中使用上述方法,您可以创建所需的带有周数的列表。

【讨论】:

  • 我要求提供第一周特定年份的周数列表。即 2017 年的输出将是 [1, 5, 9, 13, 18, 22, ...]
  • 您的帖子似乎表明您要查找第一周的星期日,并且您将第一周定义为第一个星期日的那一周。我向您展示了如何在不使用周数的情况下找到第一个星期日。所以你不需要周数。无论如何,周数都是模棱两可的,因为您必须定义一年中的第一周是什么。 ISO 和 MS 对此意见不一。
  • 抱歉,如果我不清楚,有没有办法找出我在找什么?
【解决方案2】:

我已经完成了几个月的循环,然后得到了第一个星期日(从一个月的 1st 开始,一直到第二天直到找到星期日),然后得到了第一个星期天- 找到日期的年份:

from datetime import datetime
from datetime import date

# dayofweek: Sunday=0, Monday=1 and so on
def get_week_number(year=2017, dayofweek=0):
    weeks = []

    for month in range(1, 13):
        # get first Sunday of month
        d = date(year, month, 1)
        while(d.weekday() != dayofweek):
            d = d.replace(day=d.day + 1)

        # isocalendar()[1] is the week-of-year field
        weeks.append(d.isocalendar()[1])

    return weeks

print(get_week_number(2017, 0))

但是,结果与您的预期不同:

[1, 6, 10, 14, 18, 23, 27, 32, 36, 40, 45, 49]

我也尝试使用weeks.append(int(d.strftime("%W"))),但结果相同 - 我使用的是 Python 3.5.2 和 a week is defined as

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

【讨论】:

  • 感谢@Hugo,这很有帮助
猜你喜欢
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2021-03-11
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多