pyudf 计算自然周和当周周一
目录
- 目标
- 代码
- 效果
目标
业务统计需要按照自然周看数据,所以把每天计算都归到自然周。
展示的时候用自然周的周一来代替自然周展示。
odps 没有计算自然周的函数,所以用 Python 做了一个 udf 来实现。
一年的第一天是周一,那么这一年的自然周就是以01开始,否则是以00,
这个在计算对应的周一时会产生问题,针对跨年周做了兼容处理。
似乎 MySQL 在计算自然周的时候也有类似问题,这里没有细查。
代码
from odps.udf import annotate
import datetime@annotate("string->string")
class get_year_week(object):def evaluate(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 ywexcept:return None@annotate("string->string")
class get_year_week_day(object):def evaluate(self, yearsweek):iosweekday=1try :year = yearsweek[:4]# if 0101 is monday, the yearweek will begin on 01,need mines 1if 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 | _c1 | monday |
---|---|---|
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 |
pyudf 计算自然周和当周周一相关推荐
- mysql 计算自然周
mysql 计算自然周距离现在多少周的方法 set @install = '2020-10-24 18:00:00'; select @install, date_format(@install - ...
- oracle判断为周一_oracle根据四位年周取当周周一的日期函数
create or replace function FUNC_GET_DATE_BY_WEEK ( theYearWeek IN VARCHAR2 ) return date is normalDa ...
- PHP获取自然周日期(周一~周日)
使用date()函数:PHP: date - Manual w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六) $time = time(); // 可设定日期$week_day_nu ...
- PHP获取自然周始末时间
之前做了一个项目做抽奖的,里面有个需求,每个用户每个自然周能抽中一次指定产品. 自然周指的是:从周一到周日算作一个自然周. 但是作为PHP中的lower,还是能力捉急,只好百度 还挺多的嘛!想也不想先 ...
- 自定义周次开始时间,结束时间,计算一年中的周次(非自然周次)
自定义周次开始时间,结束时间,计算一年中的周次(非自然周次),从数据库中读取时间,然后以此时间为开始时间,并且为第一周周一的开始时刻,每过7天 累计为一周,同时算出周次的开始日期和结束日期. pack ...
- 查询某一日期所在的自然周,以周一为开始
查询某一日期所在的自然周,以周一为开始 代码如下: import java.text.SimpleDateFormat; import java.util.Calendar; import java. ...
- php获取当前日期所在自然周周一周末以及前后自然周始末
php获取当前日期所在自然周周一周末以及前后自然周始末 首先,获取当前时间,date函数,方法较多,展示一种: $present = date('y-m-d',time());//当前日期 然后获取当 ...
- python3--日期时间处理最近n个自然周计算
第一部分:最近n个自然周计算 算法逻辑: 1.12日是星期三,近一自然周是从1.10开始的日期,中间相差2天 1.13日是星期四,近一自然周是从1.10开始的日期,中间相差3天 1.14日是星期五,近 ...
- Java 周日期计算工具,获取当前第几周,按周数获取周一至周日,按日期获取周一至周日
记一个自己写的工具类: 1.按时间获取当前第几周 getzs 3.按日期获取周一至周日getgetBetweenDates2 4.按年份跟周数获取周一至周日 getgetBetweenDates3 结 ...
最新文章
- 直方图(opencv)
- asp.net 在 Ngnix 服务器 中配置攻略
- Why to do,What to do,Where to do 与 Lambda表达式!
- 如何进入python程序代码编辑环境_Python怎么打开代码编辑器 来学习吧
- 使用Cocoapods快速创建自己的podspec,让你的框架支持cocoapods,podspec
- find之exec和args
- react jsoneditor 的学习使用
- 分别使用docx4j,jacob将文字与图片插入word中书签位置
- winrar去弹窗广告激活办法!!
- 10.计算机基础之程序设计基础
- SQL注入实战 绕WTS-WAF
- OpenCV物体颜色检测(Python)
- 局域网计算机网卡启动,远程启动局域网内电脑
- 【投屏】Scrcpy源码分析四(最终章 - Server篇)
- Python工程师月薪15K以上,Python能做机器学习吗?
- 微信公众号加外链怎么不管用——已解决
- form表单的submit()和onsubmit()的区别
- 微信强制加入群软件!易语言协议版,公开源码
- One-Lin3r:懒人的福音,渗透测试单行化工具
- 印度区块链项目Matic Network的应用场景分析
热门文章
- Win10下音频设备无法播放音乐问题定位
- Python代码实现-主成分分析(PCA)降维及故障诊断中的T2和SPE统计量Matplotlib出图|Python技能树征题
- 《流量的秘密》读后感
- VS2019 C++的跨平台开发——Linux开发
- java输出的时候出现[Ljava.lang.String是什么意思+解决方法
- 【C语言】用函数实现求两个自然数的最大公约数
- 基于Android实现之智慧记单词APP【100011028】
- 计算机中文速记四级在哪里考试,计算机中文速记员国家标准要求
- 只狼:影逝二度PC官方中文版启动测试
- 输出 [2,100] 范围内所有的质数及质数的个数