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

Karen110
• 阅读 1536

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

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

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

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 的用法也就没有提到。

(Python实战文)一篇文章教会你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())

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

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

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

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/WDbourh6lo2E5ho6DjOMJQ,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_