【问题标题】:python, how to know the week number in the year of the day, Saturday as the first day of the weekpython,如何知道一年中的星期数,星期六是一周的第一天
【发布时间】:2015-08-14 09:42:47
【问题描述】:

我正在使用 python/pandas,并且想知道如何获取一年中某一天的周数,而星期六是一周的第一天。 我确实搜索了很多,但一直将星期一或星期日作为一周的第一天...... 请帮忙...谢谢

谢谢大家!真的很感谢你所有的快速回答......但我不得不道歉,我没有清楚地提出我的问题。

我想知道一年中的周数。例如,2015-08-09 是第 32 周,而星期一是一周的第一天,但​​第 33 周是一周的第一天。

感谢@Cyphase 和大家,我对Cyphase 的代码稍作修改,它可以工作了。

def week_number(start_week_on, date_=None):
    assert 1 <= start_week_on <= 7  #Monday=1, Sunday=7

    if not date_:
        date_ = date.today()

    __, normal_current_week, normal_current_day = date_.isocalendar()
    print date_, normal_current_week, normal_current_day

    if normal_current_day >= start_week_on:
        week = normal_current_week + 1
    else:
        week = normal_current_week

    return week

【问题讨论】:

  • “但一直将星期一或星期日作为一周的第一天” - 这不是一个很好的解决方案,但您可以只取数字并始终减去或添加以弥补范围的差异。
  • 你不能只做dt.dayofweek5,如果它是负数,加7循环吗?
  • 感谢 EdChum,但我没有说清楚,我实际上需要一年中的周数。我编辑了我的问题。
  • 因此,在这种情况下,如果星期几是星期一或星期日,您将在一年中的一周中添加 1

标签: python pandas


【解决方案1】:

如果我理解正确,以下是您想要的:

In [101]:
import datetime as dt
import pandas as pd
​
df = pd.DataFrame({'date':pd.date_range(start=dt.datetime(2015,8,9), end=dt.datetime(2015,9,1))})
df['week'] = df['date'].dt.week.shift(-2).ffill()
df['orig week'] = df['date'].dt.week
df['day of week'] = df['date'].dt.dayofweek
df

Out[101]:
         date  week  orig week  day of week
0  2015-08-09    33         32            6
1  2015-08-10    33         33            0
2  2015-08-11    33         33            1
3  2015-08-12    33         33            2
4  2015-08-13    33         33            3
5  2015-08-14    33         33            4
6  2015-08-15    34         33            5
7  2015-08-16    34         33            6
8  2015-08-17    34         34            0
9  2015-08-18    34         34            1
10 2015-08-19    34         34            2
11 2015-08-20    34         34            3
12 2015-08-21    34         34            4
13 2015-08-22    35         34            5
14 2015-08-23    35         34            6
15 2015-08-24    35         35            0
16 2015-08-25    35         35            1
17 2015-08-26    35         35            2
18 2015-08-27    35         35            3
19 2015-08-28    35         35            4
20 2015-08-29    36         35            5
21 2015-08-30    36         35            6
22 2015-08-31    36         36            0
23 2015-09-01    36         36            1

上面使用dt.weekshifts 2行然后向前填充NaN值。

【讨论】:

  • -2 班次是从星期六而不是星期一作为一周的第一天来的吗?
  • 是的,我检查了这个,看看我的更新,这显示了之前和星期几
  • 谢谢@EdChum。我试过你的代码,它确实有效,这确实是一种更聪明的方法。但它在我的代码中不起作用,因为我在行中有重复的日期,例如3 行 '2015-08-09'、10 行 '2015-08-10' 等等......那么在这种情况下,'shift' 将不起作用。还是谢谢。
  • 但是如果你只是做了dt.week,然后如果星期几是星期一或星期日从中减去 1,那么我是否正确?
  • 感谢 Ed,这很有教育意义。
【解决方案2】:
import datetime
datetime.date(2015, 8, 9).isocalendar()[1]

【讨论】:

  • 这将给出 isocalendar 周数,本周从星期一开始(参见 docs.python.org/2/library/…
  • @chris-sc 所以你希望它在星期六作为一周的第一天?
【解决方案3】:

你可以这样做:

from datetime import date


def week_number(start_week_on, date_=None):
    assert 0 <= start_week_on <= 6

    if not date_:
        date_ = date.today()

    __, normal_current_week, normal_current_day = date_.isocalendar()

    if normal_current_day >= start_week_on:
        week = normal_current_week
    else:
        week = normal_current_week - 1

    return week


print("Week starts     We're in")
for start_week_on in range(7):
    this_week = week_number(start_week_on)
    print("   day {0}         week {1}".format(start_week_on, this_week))

第 4 天(星期四)的输出:

Week starts     We're in
   day 0         week 33
   day 1         week 33
   day 2         week 33
   day 3         week 33
   day 4         week 33
   day 5         week 32
   day 6         week 32

【讨论】:

  • 感谢 Cyphase,但我没有说清楚,我实际上需要一年中的周数。我编辑了我的问题。
  • @fuji4900,我已经编辑了答案以反映您澄清的问题。
  • 非常感谢!您的代码对我来说不是 100% 有效,但我理解您的想法,并进行了一些更改,然后就可以了!请看我的问题..
  • @fuji4900,什么不起作用?我想知道,所以我可以修复它:)。编辑:你是如何使用它的?哪来的天数?
  • 我只更改了 2 行:我将 start_week_on 设为 1-Monday,7-Sunday。我认为应该再加上 1 周 if normal_current_day &gt;= start_week_on:
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多