Python 默认支持时间序列的库有很多,通常 time 和 datetime 是用的最多的,虽然他们在一般情形下绝对够用,但是总有一些比较奇葩的时间格式的需求,而我们也就不能仅限于这两个 Python 自带的库。
DateParser 和 Dateutil
这是两款比较友好的用于处理各种时间格式的第三方库,它能将各种奇怪写法的时间转换成标准的时间格式,比如:
- # -*- coding: utf-8 -*-
- # @Time : 2020-12-05 16:46
- import time
- import dateparser
- from dateutil import parser
- print(dateparser.parse("2020/11/7 5:01:08"))
- print(parser.parse("2020"))
碰到个需求
最近在做一些自动化文件导出的时候,由于有一些平台有导出的数量限制,比如某某平台如果所选时间是半年,然后累计数据量达到 50w,就会导出失败。
对于这种情况就要做一下时间切分,比如可以分为按月,甚至按周来进行导出,也就是 rangeTime。
当在 Google 上搜索 Python time 或者 Datetime 切分时间的时候发现并没有什么结果,然后就会想起有个更牛的处理时间的库,也就是 Arrow 了。
很多的博客对 Arrow 的讲解也都是一带而过,贴出官方的例子,并没有应用于实际的项目,所以更多 Arrow 的用法也就没有提到。
Arrow
和 DateParser 一样,Arrow 底层也是用 datetime 封装的,在特定的地方可以和 datetime 进行交互。
一些用法展示:
- # -*- coding: utf-8 -*-
- # @Time : 2020-12-05 16:46
- i = arrow.now()
- # i.replace(day=1) 替换时间为 1 号
- # i.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-DD HH:mm:ss'))
回到解决刚才的那个需求, Arrow 的时间区间属性可以在一段时间中根据不同时间粒度来进行切分,来达到我们的需求。
- # -*- coding: utf-8 -*-
- # @Time : 2020-12-05 16:46
- import arrow
- # 开始于当前时间,往前推 120 天
- end = datetime.datetime.now()
- start = end + datetime.timedelta(days=-120)
- # 获取 120 内的时间范围,以月划分
- def timeYmdRange(start=start,end=end):
- tRange = []
- for r in arrow.Arrow.span_range('months', start, end):
- qTime = [i.format('YYYY-MM-DD') for i in r]
- tRange.append(qTime)
- return tRange
- # 获取 120 内的时间范围,以周划分
- def timeWeekRange(start=start,end=end):
- tRange = []
- for r in arrow.Arrow.span_range('weeks', start, end):
- qTime = [i.format('YYYY-MM-DD') for i in r]
- tRange.append(qTime)
- return tRange
- # 自定义时间格式,按月划分,结果为 202011
- def timeMonthRange(start=start,end=end):
- tRange = []
- for r in arrow.Arrow.range('months', start, end):
- qTime = r.format('YYYYMM')
- tRange.append(qTime)
- return tRange
- for r in timeHmsRange(start, end):
- print(','.join(r))
- print(timeWeekRange())
这样一来就可以满足我们的需求,并且保证在特定时间区间内不会重复天数(或者更小的时间粒度),不要使用很多很多的时间处理库,用的越多也就更加错综复杂,有那么一两款好用,易用的时间库足矣,哈哈 !!
孩童起我们就听过“追随自己梦想”的建议和教导,但实际这样做时,途中往往会遇...
背景 我们负责的一个业务平台,有次在发现设置页面的加载特别特别地慢,简直就是...
加快智慧法院建设,是顺应新一轮科技革命浪潮的必然选择。以数字化、网络化、智...
管理人的方法其实一般的团队管理经验都适用,如:量化的可考核的KPI指标(如:根...
全面披露-我目前是一名Python工程师,因此您可以认为我有偏见。但是我想揭露一些...
在上一周的sedo 域名交易 榜上,小编注意到国别 域名 swap.io以50,000美元成交了...
1.A:你有《时间简史》吗?B:神经病,我有时间也不捡屎! 2.夏天,我洗澡的时...
高防主机租用中防火墙有什么意义 ?我们对于防火墙有多少了解呢?我们要知道防火墙...
虚拟主机 怎么实现独立ip的?虚拟主机要想实现独立IP,可直接购买具有独立IP的虚...
TOP云 (west.cn)2月6日消息,根据最新出炉的dnj交易榜显示,两枚交通工具相关 ...