时间处理相关杂记

  1. 时间间隔timedelta的扩展使用

我们在处理时间间隔的时候,肯定都使用过timedelta进行时间的加减。

In [11]: from datetime import datetime

In [12]: now = datetime(2018,2,6) 

In [13]: from datetime import timedelta

In [14]: now + timedelta(days=1)
Out[14]: datetime.datetime(2018, 2, 7, 0, 0)

但是当我们进行月份相加的时候就会报错

In [15]: now + timedelta(months=1) 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 now + timedelta(months=1)

TypeError: 'months' is an invalid keyword argument for this function

类似的时间计算可以使用 dateutil.relativedelta() 函数代替

In [18]: from dateutil.relativedelta import relativedelta 

In [19]: now + relativedelta(months=1) 
Out[19]: datetime.datetime(2018, 3, 6, 0, 0)

还能进行差值月份统计

In [23]: b = datetime(2018, 1,2) 

In [24]: now - b 
Out[24]: datetime.timedelta(35)

In [25]: d = relativedelta(now,b) 

In [26]: d
Out[26]: relativedelta(months=+1, days=+4)

In [27]: d.months
Out[27]: 1

In [28]: d.days
Out[28]: 4
  1. 有关将字符串转为时间类型
    大家都知道我们可以使用strptime将字符串转为时间格式
In [29]: from datetime import datetime

In [30]: text = '2018-02-06' 

In [31]: y = datetime.strptime(text, '%Y-%m-%d') 

In [32]: y 
Out[32]: datetime.datetime(2018, 2, 6, 0, 0)

需要注意的是, strptime() 的性能要比你想象中的差很多, 因为它是使用纯Python实现,并且必须处理所有的系统本地设置。 如果你要在代码中需要解析大量的日期并且已经知道了日期字符串的确切格式,可以自己实现一套解析方案来获取更好的性能。 比如,如果你已经知道所以日期格式是 YYYY-MM-DD ,你可以像下面这样实现一个解析函数:

In [33]: from datetime import datetime

In [34]: def parse_ymd(s): 
    ...:     year_s, mon_s, day_s = s.split('-') 
    ...:     return datetime(int(year_s), int(mon_s), int(day_s)) 
    ...: 

In [35]: parse_ymd(text) 
Out[35]: datetime.datetime(2018, 2, 6, 0, 0)

实际测试中,这个函数比 datetime.strptime() 快7倍多。 如果你要处理大量的涉及到日期的数据的话,那么最好考虑下这个方案!

你可能感兴趣的:(时间处理相关杂记)