当前位置: 首页 > 科技观察

一篇文章教你Arrow时间库在项目中的实际应用

时间:2023-03-14 00:00:04 科技观察

Python有很多库默认支持时间序列。通常时间和日期时间是最常用的。一些奇葩的时间格式要求,也不能局限于Python自带的这两个库。DateParser和Dateutil是两个友好的第三方库,用于处理各种时间格式。他们可以将各种写的奇怪的时间转换成标准的时间格式,比如:#-*-coding:utf-8-*-#@Time:2020-12-0516:46importtimeimportdateparserfromdateutilimportparserprint(dateparser.parse("2020/11/75:01:08"))print(parser.parse("2020"))遇到一个需求,最近在做一些自动化文件导出时,有些平台对导出数量有限制。比如某平台选择的时间是半年,累计数据量达到50万,就会导出失败。在这种情况下,需要进行时间分段。比如可以分为按月甚至按周导出,即rangeTime。在谷歌上搜索Python时间或者Datetime拆分时间,没有找到结果,这才想起还有一个更好的处理时间的库,就是Arrow。很多博客也简单介绍了Arrow,贴出了官方的例子,但是没有应用到实际项目中,所以Arrow的更多用法就没有提到。Arrow和DateParser一样,Arrow底层也封装了datetime,在特定的地方可以和datetime进行交互。一些用法显示:#-*-coding:utf-8-*-#@Time:2020-12-0516:46i=arrow.now()#i.replace(day=1)替换时间为#ionthe1日。shift(months=-1)偏移量,向前推一个月#i.format('YYYY-MM-DD')转换成你想要的时间格式print(i.shift(days=-30).format('YYYY-MM-DD'))print(i.shift(months=-3).format('YYYY-MM-DD'))#一起使用,链式规则print(i.replace(day=1).shift(months=-1).format('YYYY-MM-DD'))print(i.replace(day=1).shift(months=-1).format('YYYY-MM-DDHH:mm:ss'))继续回到刚才解决的需求,Arrow的时间间隔属性可以在一段时间内按照不同的时间粒度进行分段,来满足我们的需求。#-*-coding:utf-8-*-#@Time:2020-12-0516:46importarrow#从当前时间开始,向前推进120天end=datetime.datetime.now()start=end+datetime.timedelta(days=-120)#得到120以内的时间范围,除以月deftimeYmdRange(start=start,end=end):tRange=[]forrinarrow.Arrow.span_range('months',start,end):qTime=[i.format('YYYY-MM-DD')foriinr]tRange.append(qTime)returnRange#获取120以内的时间范围,除以周deftimeWeekRange(start=start,end=end):tRange=[]forrinarrow.Arrow.span_range('weeks',start,end):qTime=[i.format('YYYY-MM-DD')foriinr]tRange.append(qTime)returnRange#自定义时间格式,除以月份,结果为202011deftimeMonthRange(开始=开始,结束=结束):tRange=[]forrinarrow.Arrow.range('月',开始,结束):qTime=r.format('YYYYMM')tRange.append(qTime)returnRangeforrintimeHmsRange(开始,结束):print(','.join(r))print(timeWeekRange())这样可以满足我们的需求,保证天数(或者更小的时间粒度)不会在一个sp中重复ecifictimeinterval,don'tuse时间处理库有很多很多,越用越复杂。有那么一两个好用的,一个好用的时间库就够了,哈哈!!