python计数商业周

时间:2012-08-14 02:08:06

标签: python datetime

考虑到开始日期,我如何确定Python的“工作周”数量?我不能只是除以7,因为这不会给我正确的答案。

一个例子是2012年8月1日到当前日期(2012年8月13日)的开始日期将输出3周。

我基本上试图从足球赛季开始就知道,本周(整数)是什么。

我已经尝试过使用Pythons datetime模块,但它无济于事。

4 个答案:

答案 0 :(得分:7)

尝试使用datetime.weekdaydatetime.isoweekday获取当周的当前日期,或使用更完整的datetime.isocalendar来获取当年的当前一周并将其用作偏移量来计算一致的差异。

所以你可以拥有这样的功能:

def week_difference(start, end):
    assert start <= end
    start_year, start_week, start_dayofweek = start.isocalendar()
    end_year, end_week, end_dayofweek = end.isocalendar()

    return ((end_year - start_year) * 52) - start_week + end_week

使用方式如下:

import datetime as dt
# same week
In [1]: week_difference(dt.datetime(2012, 8, 1),  dt.datetime(2012, 8, 1))
Out[1]: 0

# your example (see note below) 
In [2]: week_difference(dt.datetime(2012, 8, 1),  dt.datetime(2012, 8, 13))
Out[2]: 2

# across years
In [3]: week_difference(dt.datetime(2011, 8, 1),  dt.datetime(2012, 8, 13))
Out[3]: 54

# year boundary: second last business week of 2011, to first business week of 2012
# which is the same business week as the last business week of 2011
In [4]: week_difference(dt.datetime(2011, 12, 20),  dt.datetime(2012, 1, 1))
Out[4]: 1

In [5]: week_difference(dt.datetime(2011, 12, 18),  dt.datetime(2012, 1, 1))
Out[5]: 2

您可以将1添加到您的周输出中,具体取决于您选择的周差异的语义。

答案 1 :(得分:2)

获得日期时间对象时......

import datetime
today = datetime.datetime.now()
start = datetime.datetime(2012, 9, 5)

...您还可以使用isocalendar ...

today.isocalendar()
>>> (2012, 33, 1)
start.isocalendar()
>>> (2012, 36, 3)

这个3元组返回年份,一年中的星期和星期几。如果您只关心一年,那么您可以简单地减去“一年中的一周”值(我可能会在这里减去一个......)。否则,你需要参与一年。

答案 2 :(得分:0)

一衬垫:

datetime.date.isocalendar(datetime.date.today())[1] - datetime.date(2012, 8, 1).isocalendar()[1] + 1

答案 3 :(得分:0)

我的单行延伸到年份界限:

start_date = datetime.date(2012, 8, 1)
print ((datetime.date.isocalendar(datetime.date.today())[0]-datetime.date.isocalendar(start_date)[0])*52)+(datetime.date.isocalendar(datetime.date.today())[1]-datetime.date.isocalendar(start_date)[1])+1
>>> 3

注意:如果start_date是将来(从今天开始),此函数仍将返回负值!