業務統計需要按照自然週看資料,所以把每天計算都歸到自然周。
展示的時候用自然周的周一來代替自然周展示。
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
date1select date1,yearweek(date1)
,yearweekday(yearweek(date1)
) monday
from date_list;
_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...