我们假设我有一个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等等。
答案 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
如果您正在处理多个时区,则可能需要确保d0
和d
具有相同的时区,否则您可能会得到错误的结果。