如何用Python的Delorean进行日期时间运算、修改和截断

250 阅读4分钟

简介

日期时间打交道可能有点令人生畏和具有挑战性,在Python中处理日期时间也不例外。 Python内置的datetime 模块向我们介绍了几个类--date,datetime,time,timezonetimedelta ,还有几个外部库已经产生,以解决官方模块中存在的问题,比如Arrow

在本指南中,我们将看看如何在Python中对数据时间对象进行时间和日期的运算、改变和截断。 Delorean- 一个建立在**pytz基础上的库,pytz是解决与时区有关的问题的标准库,而dateutil**则用于计算任何两个给定日期时间对象之间的三角。

安装Delorean 建立一个虚拟环境

Delorean可以通过pip 进行安装。一般来说,在虚拟环境中工作是明智的,因为它可以让你把不同项目所需的依赖关系隔离开来。

在Linux或MacOS上创建一个虚拟环境,我们要运行。

$ python3 -m venv env
$ source env/bin/activate
$ python3 -m pip install delorean

或者,在Windows上,我们可以运行。

$ virtualenv env
$ .\env\Scripts\activate
$ python3 -m pip install delorean

用Timedelta添加和减去时间

timedelta 表示两个 对象之间的差异,其分辨率为微秒。使用 ,我们可以定义不同长度的持续时间,如 、 、 、 、 和 。datetime timedelta microseconds seconds minutes hours days weeks

它不包含任何关于日期的信息--只包含持续时间。6月5日和6月10日之间的timedelta ,与5月5日和5月10日之间的timedelta ,是一样的。 5天。

这使得从datetime 对象中添加或减去一个时间长度变得非常容易。

from delorean import Delorean
import datetime

dt_tm_future = Delorean()
dt_tm_future += datetime.timedelta(days=3)

dt_tm_past = Delorean()
dt_tm_past -= datetime.timedelta(weeks=3)

print("The date 3 days from now is: ", dt_tm_future)
print("The date 3 weeks before now was: ", dt_tm_past)

这就导致了:

The date 3 days from now is:  Delorean(datetime=datetime.datetime(2021, 7, 17, 10, 22, 51, 403546), timezone='UTC')
The date 3 weeks before now was:  Delorean(datetime=datetime.datetime(2021, 6, 23, 10, 22, 51, 403643), timezone='UTC')

用Delorean获取日期间的天数

一个常见的有多个日期的未知数是两个给定日期之间的天数。鉴于这个结果通常被打包在一个timedelta 对象中,因为它是用来表示这种差异的。

鉴于timedelta 与日期相加或相减是多么容易,这个操作自然也很容易。

在 Python 中用 Delorean 得到两个日期之间的天数,我们只需减去这两个日期,结果是用timedelta 表示差异。

present_date = Delorean()
new_year = Delorean(datetime=datetime.datetime(2022, 1, 1), timezone='UTC')
until_new_year = new_year - present_date
print("Days until 2022 ", until_new_year)
print("Days till 2022 ", until_new_year.days)

我们可以打印整个timedelta 对象,或者只访问其days 属性。

Days until 2022  170 days, 13:24:22.817417
Days till 2022  170

时间和日期的改变

Delorean让你毫不费力地通过替换或移动数值来改变数据时间对象。为此,我们使用replace()shift() 方法。

replace() 方法可以让你替换数据时间实例的某个方面,而shift() 可以让你改变时区。

from delorean import Delorean

date = Delorean(datetime=datetime.datetime(2021, 5, 14, 12), timezone='Europe/Paris')

altered_tm = date.replace(hour=10)
altered_dt = date.replace(month=10)

print("Altered time is:", altered_tm)
print("Altered date is:", altered_dt)

altered_dt.shift('US/Pacific')
print("Shifted object:", altered_dt)

我们创建了一个Delorean 实例,改变了它的hourmonth 属性,然后将这个新的、经过改变的日期时间对象转移到一个新的时区。

Altered time is: Delorean(datetime=datetime.datetime(2021, 5, 14, 10, 0), timezone='Europe/Paris')
Altered date is: Delorean(datetime=datetime.datetime(2021, 10, 14, 12, 0), timezone='Europe/Paris')
Shifted object: Delorean(datetime=datetime.datetime(2021, 10, 14, 3, 0), timezone='US/Pacific')

用Delorean截断日期时间对象

根据你使用datetime 的原因--你可能不关心秒或毫秒这样的小阶测量。truncate() 虽然你可以简单地打印出没有测量值的数据--但你也可以把它们从Delorean 对象本身打印出来。

该方法对高阶测量值也有效,并接受所有有效的Delorean时间段,最高可达years

from delorean import Delorean

date = Delorean()
print("Date before truncation:", date)

trun_min = date.truncate('minute') # Truncate to minutes
print("Truncated to minutes = ", trun_min)

值得注意的是,你要截断到一定的测量水平。这就是说--如果你截断到分钟,秒和毫秒将被删除。从本质上讲--你在设置Delorean 实例的分辨率。

Date before truncation: Delorean(datetime=datetime.datetime(2021, 7, 14, 10, 52, 9, 893770), timezone='UTC')
Truncated to minutes =  Delorean(datetime=datetime.datetime(2021, 7, 14, 10, 52), timezone='UTC')

总结

在本指南中,我们看了如何用Delorean在Python中进行时间和日期的运算、改变和截断。