所以我有一個 shell 腳本,它使用 SQL 查詢回傳周數:
select TO_CHAR(TO_DATE('01/01/2022','DD/MM/YYYY'),'fmWW') as WEEK from dual;
此查詢回傳 1。(從 1 月 1 日開始)
Python代碼:我嘗試了以下但是它回傳 52 而不是 1 :
week=datetime.date(2022,1,1).isocalendar()[1]
從周一至周日開始的一周
有沒有另一種方法可以讓我從 1 月 1 日開始獲得一年中的周數,所以我在 2022 年 1 月 1 日得到 1?
所需輸出:
Week ending Jan 2 2022 = 1
Week ending Jan 9 2022 = 2
Week ending Jan 16 2022 = 3
uj5u.com熱心網友回復:
有沒有另一種方法可以讓我從 1 月 1 日開始獲得一年中的周數,所以我在 2022 年 1 月 1 日得到 1?
正如您在問題中所說,您可以使用給定的 date dt:
TO_CHAR(dt, 'fmWW')
或者可以使用以下方法計算:
FLOOR((dt - TRUNC(dt, 'YY'))/7) 1
或者,為了匹配 python 代碼,可以使用以下方法獲取 ISO 周:
TO_CHAR(dt, 'fmIW')
或者,如果您想從 1 月 1 日開始計算周數并在星期一更改周數,則:
FLOOR((dt - TRUNC(TRUNC(dt, 'YY'), 'IW'))/7) 1
然后查詢:
WITH sample_dates (dt) AS (
SELECT DATE '2021-12-30' LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 40
)
SELECT dt,
TO_CHAR(dt, 'fmWW') AS week,
TO_CHAR(dt, 'fmIW') AS isoweek,
FLOOR((dt - TRUNC(dt, 'YY'))/7) 1 AS weekfromyearstart,
FLOOR((dt - TRUNC(TRUNC(dt, 'YY'), 'IW'))/7) 1 AS montosunweekfromyearstart
FROM sample_dates
輸出:
DT 星期 等周 從年初開始的一周 MONTOSUNWEEKFROMYEARSTART 2021-12-30 52 52 52 53 2021-12-31 53 52 53 53 2022-01-01 1 52 1 1 2022-01-02 1 52 1 1 2022-01-03 1 1 1 2 2022-01-04 1 1 1 2 2022-01-05 1 1 1 2 2022-01-06 1 1 1 2 2022-01-07 1 1 1 2 2022-01-08 2 1 2 2 2022-01-09 2 1 2 2 2022-01-10 2 2 2 3 2022-01-11 2 2 2 3 2022-01-12 2 2 2 3 2022-01-13 2 2 2 3 2022-01-14 2 2 2 3 2022-01-15 3 2 3 3 2022-01-16 3 2 3 3 2022-01-17 3 3 3 4 2022-01-18 3 3 3 4 2022-01-19 3 3 3 4 2022-01-20 3 3 3 4 2022-01-21 3 3 3 4 2022-01-22 4 3 4 4 2022-01-23 4 3 4 4 2022-01-24 4 4 4 5 2022-01-25 4 4 4 5 2022-01-26 4 4 4 5 2022-01-27 4 4 4 5 2022-01-28 4 4 4 5 2022-01-29 5 4 5 5 2022-01-30 5 4 5 5 2022-01-31 5 5 5 6 2022-02-01 5 5 5 6 2022-02-02 5 5 5 6 2022-02-03 5 5 5 6 2022-02-04 5 5 5 6 2022-02-05 6 5 6 6 2022-02-06 6 5 6 6 2022-02-07 6 6 6 7
db<>在這里擺弄
如果你想要一個 Python 函式,那么:
import datetime
def week_from_year_start(dt: datetime.date) -> int:
year_start = dt.replace(month=1, day=1)
return int((dt - year_start).days/7) 1
或者:
def mon_sun_week_from_year_start(dt: datetime.date) -> int:
year_start = dt.replace(month=1, day=1)
week_start = year_start - datetime.timedelta(days=year_start.weekday())
return int((dt - week_start).days/7) 1
uj5u.com熱心網友回復:
您正在使用 isocalendar(),因此 ISO 周定義:所以每周都有一個數字(應該與年份一起使用):在這種情況下,您仍處于 2021 年的最后一周。
我沒有找到一個簡單的解決方案,但你可以使用這個丑陋的技巧:
this_date = datetime.date(2022,1,1)
week = int(this_date.strftime("%W")) int(this_date.weekday() != 0)
它是如何作業的:python 有三周的定義:
%U:一年中的周數(星期日作為一周的第一天),作為一個零填充的十進制數。第一個星期日之前的新年中的所有日子都被認為是在第 0 周。
%W:一年中的周數(星期一作為一周的第一天),作為一個零填充的十進制數。第一個星期一之前的新年中的所有日子都被認為是在第 0 周。
%V:ISO 8601 星期,十進制數,星期一為一周的第一天。第 01 周是包含 1 月 4 日的那一周。
%W似乎是一個不錯的候選人,但它從 0 開始直到第一個星期一。
所以我們可以添加 1,但是當一年的第一天是星期一時它會失敗。第二部分只是星期一的測驗。請記住,布林值的整數是 0False和 1 True。您可能更喜歡使用if else運算子。
如果您希望從星期日開始編號,只需替換%W為%U.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/425295.html
