Python:一个月中的周数

时间:2011-08-11 16:11:57

标签: python numbers

指定日期时:

datetime.datetime(2011, 8, 15)

我如何才能知道这是本月的第三周?

如果我想要这个日期怎么办?

datetime.datetime(2011, 2, 28) //should return 4
datetime.datetime(2011, 8, 29) //should return 5

据我所知,如果给定日期是闰年,那么只有2月有4周(bissextile)

9 个答案:

答案 0 :(得分:10)

其他答案中显示的模式式方法可能会产生误导。想象一年中的几周。在365天的任何一年中,这是52天的52天,剩下一天。因此,如果我的第一年,第52周结束于12月30日,我还有12月31日担心。

我可以 认为一年有53周,并且第53周是1月31日,1月1日,1月2日,1月3日...或者,更常规地,我考虑明年的第一周实际上是从12月31日开始的。这就是你的日记口袋书的作用。

当然这意味着明年第52周结束时不是12月30日,而是12月29日。 而且每年它会一次又一天地回来,直到第6年我们已经将第52周的结束时间移回了6天(并且在闰日中进行了很好的测量)所以整个2017年的第一周将是包含在2016年,这将是愚蠢的。所以2016年将有53周。

完全相同的逻辑适用于几个月,但它可能更难发现。不幸的是,你选择了2011年8月,这是一个整齐的安排,从一个月的第一天开始。

>>> print calendar.month(2011,8)
    August 2011
Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

>>> print calendar.month(2011,9)
   September 2011
Mo Tu We Th Fr Sa Su
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
8月29日是8月的第5周,但是按照相同的逻辑,9月1日,2日3日也将在8月的第5周,因此不能在9月的第1周。

因此,9月29日的简单划分天数将是9月的第5周,但是看上面的日历,如果9月1日是8月,那么9月29日是第4周9月的。

这完全取决于你对一周开始的定义。

import datetime
import calendar

# I am assuming that the first week of a month starts with the first monday of a month...
#I *think* my logic is OK - if Monday (0) is the start of the week, then
#any dayof the month minus its own day of week (0,1,2...) must be positive
#if that day is on or after the first monday of the month

def week_of_month(tgtdate):

    days_this_month = calendar.mdays[tgtdate.month]
    for i in range(1, days_this_month):
        d = datetime.date(tgtdate.year, tgtdate.month, i)
        if d.day - d.weekday() > 0:
            startdate = d
            break
    # now we canuse the modulo 7 appraoch
    return (tgtdate - startdate).days //7 + 1

tgtdates = [datetime.date(2011, 8, 29),
            datetime.date(2011, 8, 1)
            ]

for tgtdate in tgtdates:
    print tgtdate,
    print "is in week %s" % week_of_month(tgtdate)

print calendar.month(tgtdate.year,tgtdate.month)


 # 2011-09-29 is in week 4
 # 2011-09-01 is in week 0
 #    September 2011
 # Mo Tu We Th Fr Sa Su
 #           1  2  3  4
 #  5  6  7  8  9 10 11
 # 12 13 14 15 16 17 18
 # 19 20 21 22 23 24 25
 # 26 27 28 29 30

 # 2011-08-29 is in week 5
 # 2011-08-01 is in week 1
 #     August 2011
 # Mo Tu We Th Fr Sa Su
 #  1  2  3  4  5  6  7
 #  8  9 10 11 12 13 14
 # 15 16 17 18 19 20 21
 # 22 23 24 25 26 27 28
 # 29 30 31

以上,第0周意味着本周不被视为本月的一部分。因此,1月1日是在8月的第5周。

NB

我想对@unutbu回答发表评论,但我猜我没有足够的分数。 模7方法在2011年9月失败。

>>> d = datetime.date(2011,9,28)
>>> (d.day-1)//7+1
4
>>> d = datetime.date(2011,9,1)
>>> 
>>> (d.day-1)//7+1
1

从上面的日历中,9月1日是第一周,但这意味着第28周不能在第4周 - 它必须是第5周,或者第1周是第0周......

答案 1 :(得分:8)

In [115]: d=datetime.datetime(2011, 2, 28)

In [116]: (d.day-1)//7+1
Out[116]: 4

In [117]: d=datetime.datetime(2011, 8, 29)

In [118]: (d.day-1)//7+1
Out[118]: 5

答案 2 :(得分:2)

这个(有点笨拙)的例子,使用日历模块......

import calendar
import datetime

def week(dt):
    mth = calendar.monthcalendar(dt.year, dt.month)
    for i, wk in enumerate(mth):
        if dt.day in wk:
            return i + 1

calendar.setfirstweekday(calendar.MONDAY)

week(datetime.datetime(2011, 8, 15)) # 3
week(datetime.datetime(2011, 2, 28)) # 5
week(datetime.datetime(2011, 8, 29)) # 5

......根据OP的预期,2011-02-28的答案是错误的,除非周二开始。

答案 3 :(得分:1)

也许http://labix.org/python-dateutil会有所帮助。

除此之外,它只是数学。

 from datetime import datetime, timedelta

    def week_of_month(date):
        month = date.month
        week = 0
        while date.month == month:
            week += 1
            date -= timedelta(days=7)

        return week

答案 4 :(得分:1)

这个怎么样?我们给出了我们希望找到一周的日期。我们在一个新变量中将日期重置为该月的第一天。然后,我们在第一天和给定日期创建一年中的一周。从给定日期的isoweek中减去第一个isoweek并添加一个。您添加一个来更正零索引号。这应该给出月中的周数。

import datetime

def _get_week_of_day(date):
    first_day = date.replace(day=1)
    iso_day_one = first_day.isocalendar()[1]
    iso_day_date = date.isocalendar()[1]
    adjusted_week = (iso_day_date - iso_day_one) + 1
    return adjusted_week

答案 5 :(得分:0)

testdate = datetime.datetime(2011, 2, 28)
weekofmonth = (testdate.day+7-1)/7

一般来说,找到除法的上限:(x / y)的上限=(x + y-1)/ y

答案 6 :(得分:0)

考虑@Usagi的评论:

datetime.datetime(2011, 8, 15) // should return 3
datetime.datetime(2011, 2, 28) // should return 5
datetime.datetime(2011, 8, 29) // should return 5

以下公式管理一个月的第一天不一定是星期一:

(d.day-d.weekday() -2)//7+2
  

-2和+2允许获得1到6之间的周数

答案 7 :(得分:0)

d = datetime.datetime.today()
year = d.year
month = d.month
last_day = calendar.monthrange(year,month)[1]
d = datetime.datetime(year, month, last_day)
total_week = (d.day-1)//7+1
print(total_week)

答案 8 :(得分:0)

在此处查看答案:https://stackoverflow.com/a/64192858/6089311

struct PerObjBuffer
{
    mat4 matrix;
    mat4 otherMatrix;
    vec4 colour;
    int sampleType = 0;

    size_t getBufferSize() { return offsetof(PerObjBuffer, sampleType) + sizeof(sampleType); }
    void sendToGPU() { memcpy(destination, this, getBufferSize()); }
    String shaderStringCode =

        R"(layout(binding = 2, std140) uniform perObjectBuffer
    {
        mat4 WVPMatrix;
        mat4 worldMatrix;
        vec4 perObjColour;
        int texSampleFormat;
        };
    )";