对含有时间信息的序列数据做处理,经常会遇到一类问题,就是依赖时间维度来索引数据进行作比或作差等计算,而且需求往往多种多样、变幻无穷(不一定仅仅是简单的作差或作比),因此找出对应的时间索引,是解决这类问题的关键。
比如说求同比/环比操作,就需要分别找出相邻时间段同一日期及同一时间段相邻日期。我们给定某一天日期为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库实现时间差计算