Delorean是一个在dateutil基础上进一步拓展的Python时间库,以《回到未来》中的时间旅行车命名。Delorean目前已经发展到1.0版本 ,其接口更偏向面向对象的写法,时间戳使用epoch定义,时间对象可以和datetime.timedelta进行计算,Delorean默认都调为UTC时间以避免一些时区的问题,实践代码如下。
1 | from delorean import Delorean |
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时间对象;
1 | dt=delorean.parse("2020/09/01 00:00:00 +0800") |
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可以改时区。
1 | dt.replace(hour=8) #改时间 |
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()等接口,功能类似。
1 | list(delorean.stops(freq=delorean.DAILY,count=10)) |
总结
Delorean是个挺全面的时间库,和datetime的协作很方便,但接口有些杂了,不够简洁和成体系,获取属性还需要转为datetime,显得常用的功能却没有优先封装,与Arrow、Pendulum还有些差距,是一个值得了解的Python时间库。Delorean功能的总结思维导图如下。
参考资料