设定基准点去时间旅行|Delorean使用笔记

Delorean是一个在dateutil基础上进一步拓展的Python时间库,以《回到未来》中的时间旅行车命名。Delorean目前已经发展到1.0版本 ,其接口更偏向面向对象的写法,时间戳使用epoch定义,时间对象可以和datetime.timedelta进行计算,Delorean默认都调为UTC时间以避免一些时区的问题,实践代码如下。

1
2
3
4
5
6
7
8
9
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接口概览

时间解析与转换

Delorean有多个接口用于解析和转换其他格式数据为时间对象,解析字符串用parse、处理时间戳用epoch、输入的是datetime对象直接用Delorean()。

  • delorean.parse(text):从字符串解析时间,例如parse(‘2020/01/01’);
  • delorean.epoch(ts):时间戳转时间对象,例如epoch(1357971038.13);
  • Delorean(datetime=dt):从datetime对象转为Delorean时间对象;
1
2
3
4
5
6
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可以改时区。

1
2
3
4
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()等接口,功能类似。

1
2
3
4
5
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功能的总结思维导图如下。

Delorean思维导图

参考资料