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

开发 后端
Python 默认支持时间序列的库有很多,通常 time 和 datetime 是用的最多的,虽然他们在一般情形下绝对够用,但是总有一些比较奇葩的时间格式的需求,而我们也就不能仅限于这两个 Python 自带的库。

 Python 默认支持时间序列的库有很多,通常 time 和 datetime 是用的最多的,虽然他们在一般情形下绝对够用,但是总有一些比较奇葩的时间格式的需求,而我们也就不能仅限于这两个 Python 自带的库。

[[358025]]

DateParser 和 Dateutil

这是两款比较友好的用于处理各种时间格式的第三方库,它能将各种奇怪写法的时间转换成标准的时间格式,比如:

  1. # -*- coding: utf-8 -*- 
  2. # @Time : 2020-12-05 16:46 
  3. import time 
  4. import dateparser 
  5. from dateutil import parser 
  6.  
  7. print(dateparser.parse("2020/11/7 5:01:08")) 
  8. print(parser.parse("2020")) 

碰到个需求

最近在做一些自动化文件导出的时候,由于有一些平台有导出的数量限制,比如某某平台如果所选时间是半年,然后累计数据量达到 50w,就会导出失败。

对于这种情况就要做一下时间切分,比如可以分为按月,甚至按周来进行导出,也就是 rangeTime。

当在 Google 上搜索 Python time 或者 Datetime 切分时间的时候发现并没有什么结果,然后就会想起有个更牛的处理时间的库,也就是 Arrow 了。

很多的博客对 Arrow 的讲解也都是一带而过,贴出官方的例子,并没有应用于实际的项目,所以更多 Arrow 的用法也就没有提到。

[[358026]]

Arrow

和 DateParser 一样,Arrow 底层也是用 datetime 封装的,在特定的地方可以和 datetime 进行交互。

一些用法展示:

  1. # -*- coding: utf-8 -*- 
  2. # @Time : 2020-12-05 16:46 
  3. i = arrow.now() 
  4.  
  5. # i.replace(day=1) 替换时间为 1 号 
  6. # i.shift(months=-1) 偏移量,往前推一个月 
  7. # i.format('YYYY-MM-DD') 转换为你想要的时间格式 
  8.  
  9. print(i.shift(days=-30).format('YYYY-MM-DD')) 
  10. print(i.shift(months=-3).format('YYYY-MM-DD')) 
  11.  
  12. # 配合使用,链式法则 
  13. print(i.replace(day=1).shift(months=-1).format('YYYY-MM-DD')) 
  14. print(i.replace(day=1).shift(months=-1).format('YYYY-MM-DD HH:mm:ss')) 

回到解决刚才的那个需求, Arrow 的时间区间属性可以在一段时间中根据不同时间粒度来进行切分,来达到我们的需求。

  1. # -*- coding: utf-8 -*- 
  2. # @Time : 2020-12-05 16:46 
  3. import arrow 
  4.  
  5.  
  6. # 开始于当前时间,往前推 120 天 
  7. end = datetime.datetime.now() 
  8. start = end + datetime.timedelta(days=-120) 
  9.  
  10. # 获取 120 内的时间范围,以月划分 
  11. def timeYmdRange(start=start,end=end): 
  12.     tRange = [] 
  13.     for r in arrow.Arrow.span_range('months', start, end): 
  14.         qTime = [i.format('YYYY-MM-DD'for i in r] 
  15.         tRange.append(qTime) 
  16.     return tRange 
  17.  
  18. # 获取 120 内的时间范围,以周划分 
  19. def timeWeekRange(start=start,end=end): 
  20.     tRange = [] 
  21.     for r in arrow.Arrow.span_range('weeks', start, end): 
  22.         qTime = [i.format('YYYY-MM-DD'for i in r] 
  23.         tRange.append(qTime) 
  24.     return tRange 
  25.  
  26. # 自定义时间格式,按月划分,结果为 202011  
  27. def timeMonthRange(start=start,end=end): 
  28.     tRange = [] 
  29.     for r in arrow.Arrow.range('months', start, end): 
  30.         qTime = r.format('YYYYMM'
  31.         tRange.append(qTime) 
  32.     return tRange 
  33.  
  34. for r in timeHmsRange(start, end): 
  35.     print(','.join(r)) 
  36.  
  37. print(timeWeekRange()) 

这样一来就可以满足我们的需求,并且保证在特定时间区间内不会重复天数(或者更小的时间粒度),不要使用很多很多的时间处理库,用的越多也就更加错综复杂,有那么一两款好用,易用的时间库足矣,哈哈 !!

 

责任编辑:姜华 来源: Python爬虫与数据挖掘
相关推荐

2019-10-17 19:15:22

jQueryJavaScript前端

2020-11-13 08:14:28

JavaScript

2023-06-21 00:10:17

JSONWeb服务器JavaScript

2021-02-19 19:35:53

SVG 形状元素

2021-02-17 20:40:22

SVG图像模式

2021-03-02 18:35:27

SVG开发空间

2021-12-28 09:27:45

Javascript 高阶函数前端

2021-05-29 10:20:54

GoModules语言

2021-02-24 10:14:04

PythonClassPython基础

2020-12-01 09:36:35

SVG元素属性

2020-12-16 08:07:28

语言基础反射

2021-09-15 10:00:33

Go语言Modules

2021-03-19 10:01:41

SVG画多边形Htm基础

2020-12-10 08:20:27

Python微博评论

2020-12-20 09:59:13

Go语言基础技术

2021-12-30 10:28:30

Python 微博评论

2020-12-31 08:35:07

Python抖音浏览器

2024-04-11 12:57:55

Python函数

2021-03-17 09:59:26

Python函数调用

2021-07-10 10:01:37

Python简单函数
点赞
收藏

51CTO技术栈公众号