基于datetime库实现时间差计算

Python fireling 6854℃

对含有时间信息的序列数据做处理,经常会遇到一类问题,就是依赖时间维度来索引数据进行作比或作差等计算,而且需求往往多种多样、变幻无穷(不一定仅仅是简单的作差或作比),因此找出对应的时间索引,是解决这类问题的关键。

比如说求同比/环比操作,就需要分别找出相邻时间段同一日期同一时间段相邻日期。我们给定某一天日期为2017-03-31,那么如何找出它所对应的日期呢?

好在Python中有个datetime库,支持日期之间的间隔运算。比如说,


sourcedate = datetime.date(2017, 3, 31)
print(sourcedate)
>> 2017-03-31

aimdate = sourcedate+datetime.timedelta(days=1, hours=0, minutes=0, seconds=0)
print(aimdate)
>> 2017-04-01

aimdate = sourcedate-datetime.timedelta(days=1, hours=0, minutes=0, seconds=0)
print(aimdate)
>> 2017-03-30

datetime中的timedelta方法,支持weeks、days、hours、minutes、seconds、microseconds、milliseconds等粒度,我们可以轻松计算出给定日期的同一时间段相邻日期。但是,给定日期的相邻时间段同一日期,比如说,计算2017-03-31对应上个月日期及下个月的日期,timedelta方法并不支持。

也许有人会说,这好办,直接采用timedelta函数,将days参数设置为1个月的天数不就哦了?

那该设置为1个月多少天呢?一年有12个月,而这些月份的天数不全都是一样的,设置成哪个都会存在不合适的月份。而且,数据库中的数据不一定是日期连续的,可能存在缺失,因此按照数据间隔往前或往后推算的办法也是行不通的。因此在找到合适的其他库之前,只能自己写相关的处理函数,来满足相差基数为的需求了。


import datetime
import calendar
def add_months(sourcedate, months):
    month = sourcedate.month+months
    year = int(sourcedate.year+(month-1)/12)
    month = (month-1)%12+1
    day = min(sourcedate.day, calendar.monthrange(year, month)[1])
    return datetime.date(year, month, day)

我们有了add_months方法,便可以计算给定日期的相邻时间段同一日期了。比如说,


sourcedate = datetime.date(2017, 3, 31)
print(sourcedate)
>> 2017-03-31

aimdate = add_months(sourcedate, 1)
print(aimdate)
>> 2017-04-30

aimdate = add_months(sourcedate, -1)
print(aimdate)
>> 2017-02-28

以上,得到满足要求的日期索引,我们就可以取出其对应的数据,来进行各种姿势的数据计算了。

 

转载请注明:宁哥的小站 » 基于datetime库实现时间差计算

喜欢 (12)