将月份转换为离散时间段

时间:2017-10-02 21:24:28

标签: python datetime

我们假设我有一个datetime.date格式的日期列表。我想将几个月的日期转换为离散(整数)时段。

即,

myList = [datetime.date(2015,02,08), datetime.date(2015,02,25), datetime.date(2015,05,03), datetime.date(2016,03,27)]

由于最小的年/月是2015/02年,那个月相当于0. 2015/03的下个月将是1,等等。直到上个月2016/03年将是13。

我想要一个函数,我给它一个开始日期,然后它给我一个离散的月份。

即,

discretizeMo(start_date, date_of_interest)
discretizeMo('2012-02-01', '2013-01-01')

会返回11等等。

3 个答案:

答案 0 :(得分:2)

您可以减去年份部分,将其乘以12以获得月份差异,然后减去月份部分:

def discretizeMo(start_date, end_date):
    return (end_date.year - start_date.year) * 12 + \
           (end_date.month - start_date.month)

从那时起,只需在每个元素和最小元素之间应用此函数:

result = [discretizeMo(min(myList), x) for x in myList]

答案 1 :(得分:1)

好吧,既然你放弃了这些日子,通常的日期算术就没用了。最简单的解决方案是转换年份和时间。几个月的规模:

def discretizeMo(d1, d2):
    return (d2.year * 12 + d2.month) - (d1.year * 12 + d1.month)

结果是自d1日期到d2日期之后经过的月数。

那很简单。

如果你想将它拆分成较小的固定长度单位(例如几周),它会有所不同:

def discretizeMo(d1, d2):
    return (d2 - d1).days // 7

差异来自于几天的可变持续时间:28-29-30-31。

答案 2 :(得分:1)

这很简单,因为一年总会有12个月:

def discretizeMo(d0, d):
    return (d.year - d0.year)*12 + d.month - d0.month

如果您正在处理多个时区,则可能需要确保d0d具有相同的时区,否则您可能会得到错误的结果。