pyudf 計算自然周和當周周一

2021-09-26 10:25:46 字數 2535 閱讀 7865

業務統計需要按照自然週看資料,所以把每天計算都歸到自然周。

展示的時候用自然周的周一來代替自然周展示。

odps 沒有計算自然周的函式,所以用 python 做了乙個 udf 來實現。

一年的第一天是周一,那麼這一年的自然周就是以01開始,否則是以00,

這個在計算對應的周一時會產生問題,針對跨年周做了相容處理。

似乎 mysql 在計算自然周的時候也有類似問題,這裡沒有細查。

from odps.udf import annotate

import datetime

@annotate(

"string->string"

)class

get_year_week

(object):

defevaluate

(self, arg)

:try

: ds_date = datetime.datetime.strptime(arg,

'%y%m%d'

) yw =

'{}'

.format

(ds_date.strftime(

"%y%w"))

if yw[-2

:]=='00'

: ds_date = ds_date + datetime.timedelta(days=

1- ds_date.isoweekday())

yw =

'{}'

.format

(ds_date.strftime(

"%y%w"))

return yw

except

:return

none

@annotate(

"string->string"

)class

get_year_week_day

(object):

defevaluate

(self, yearsweek)

: iosweekday=

1try

: year = yearsweek[:4

]# if 0101 is monday, the yearweek will begin on 01,need mines 1

if datetime.datetime.strptime(year,

'%y'

).isoweekday()==

1:week_num =

int(yearsweek[-2

:])-

1else

: week_num =

int(yearsweek[-2

:]) monday_of_the_week = datetime.datetime.strptime(year,

'%y'

)+ datetime.timedelta(days=

7* week_num)

# if monday_of_the_week.isoweekday(

)!= iosweekday:

monday_of_the_week = monday_of_the_week + datetime.timedelta(days=iosweekday - monday_of_the_week.isoweekday())

return monday_of_the_week.strftime(

'%y%m%d'

)except

:return

none

select date1,yearweek(date1)

,yearweekday(yearweek(date1)

) monday

from date_list;

date1

_c1monday

20180221

201808

20180219

20181231

201853

20181231

20190101

201853

20181231

20190106

201853

20181231

20190107

201901

20190107

20190108

201901

20190107

20191231

201952

20191230

20200101

201952

20191230

20201231

202052

20201228

20210101

202052

20201228

20211231

202152

20211227

20220101

202152

20211227

js獲取選中日期的當周的周一和週日

第一種方法 推薦 1 function getweekstr str 14 let time month 月第 week 周 15return time 16 1718 function getweekfromdate date 24 let week math.ceil date.getdate ...

計算當前日期所在周的周一和週日

根據日期計算所在周的周一和週日 param time 指定的日期 private static void convertweekbydate date time system.out.println 要計算日期為 sdf.format cal.gettime 輸出要計算日期 cal.setfirst...

Java 根據指定日期計算所在周的周一和週日

根據日期計算所在周的周一和週日 param time 指定的日期 private static void convertweekbydate date time system.out.println 要計算日期為 sdf.format cal.gettime 輸出要計算日期 cal.setfirst...