Delorean简介
Delorean是一个在dateutil基础上进一步拓展的Python时间库,以《回到未来》中的时间旅行车命名。Delorean目前已经发展到1.0版本 ,其接口更偏向面向对象的写法,时间戳使用epoch定义,时间对象可以和datetime.timedelta进行计算,Delorean默认都调为UTC时间以避免一些时区的问题,实践代码如下。
from delorean import Delorean
dt=Delorean() #获取当前时间,相当于now
d2=dt.replace(hour=8) #改时间要素的值
d=delorean.parse('2020/01/01')
d2.humanize() #转时间为自然语言
#'3 hours ago'
d.datetime.year #获取年份
#2020
d.datetime.strftime('%Y-%m-%d') #转为字符串
Delorean的接口也挺简约,处理字符串输入使用parse、时间偏移使用replace,概览的思维导图如下。
时间解析与转换
Delorean有多个接口用于解析和转换其他格式数据为时间对象,解析字符串用parse、处理时间戳用epoch、输入的是datetime对象直接用Delorean()。
- delorean.parse(text):从字符串解析时间,例如parse('2020/01/01');
- delorean.epoch(ts):时间戳转时间对象,例如epoch(1357971038.13);
- Delorean(datetime=dt):从datetime对象转为Delorean时间对象;
dt=delorean.parse("2020/09/01 00:00:00 +0800")
#Delorean(datetime=datetime.datetime(2020,9,1,0,0), timezone=pytz.FixedOffset(480))
dt.datetime #转为datetime类型
d.datetime.month #获取月份
dt.next_tuesday() #dt的下周二对应的时间
Delorean时间对象要转为datetime对象使用就写dt.datetime
,要获取年月日等时间属性,先转datetime再使用datetime的接口。转换及获取属性的一些方法如下:
- dt.datetime:转为datetime类型;
- dt.date:转为datetime的日期类型,输出例如datetime.date(2020,12,7);
- dt.naive:转为当前时区的时间,输出也是datetime类型;
- dt.epoch:转为时间戳;
- dt.datetime.strftime(fmt):转为格式化字符串;
- dt.datetime.year:获取时间对象的年份,不支持直接 dt.year;
- dt.humanize():把时间输出为自然语言;
时间偏移
在Delorean里年月日等时间要素的调整接口是replace,而改时区是使用的shift,我觉得整合到一个方法里会更好,其他库如Arrow是这么做的,replace可以改时区。
dt.replace(hour=8) #改时间
dt.shift('US/Eastern') #改时区
dt-dt.replace(hour=1) #时间间隔
dt - timedelta(hours=2) #两小时之前
Delorean时间对象相减得到的是datetime的timedelta类型,故dt也可以直接和datetime的timedelta想加减,说明Delorean时间对象和datetime的兼容性也很高。
时间序列
Delorean中生成一组时间值使用的是stops,源码里用到了dateutil模块的rrule方法,设定的参数包括:
- freq:两个时间点之间的时间间隔,声明序列重复的周期;写法是delorean.DAILY、delorean.MONTHLY等
- count:生成多少个时间对象;
- start:序列第一个时间点的时间,如果不设置则使用当前时间;
- stop:序列的结束的时间;
Delorean还有range_daily()、range_hourly()等接口,功能类似。
list(delorean.stops(freq=delorean.DAILY,count=10))
#Out[]:
#[Delorean(datetime=datetime.datetime(2020, 12, 07, 8, 2, 51), timezone='UTC'),
# Delorean(datetime=datetime.datetime(2020, 12, 08, 8, 2, 51), timezone='UTC'), ...
总结
Delorean是个挺全面的时间库,和datetime的协作很方便,但接口有些杂了,不够简洁和成体系,获取属性还需要转为datetime,显得常用的功能却没有优先封装,与Arrow、Pendulum还有些差距,是一个值得了解的Python时间库。Delorean功能的总结思维导图如下。