前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(Python实战文)一篇文章教会你Arrow 时间库在项目中的实际应用

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

作者头像
Python进阶者
发布2020-12-17 10:20:35
4060
发布2020-12-17 10:20:35
举报
文章被收录于专栏:Python爬虫与数据挖掘

忆君迢迢隔青天,昔日横波目,今作流泪泉。

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

DateParser 和 Dateutil

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

代码语言:javascript
复制
# -*- 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 进行交互。

一些用法展示:

代码语言:javascript
复制
# -*- 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 的时间区间属性可以在一段时间中根据不同时间粒度来进行切分,来达到我们的需求。

代码语言:javascript
复制
# -*- 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())

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档