Python 将月份转换为离散时间段

Python 将月份转换为离散时间段,python,datetime,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)] discretizeMo(start_date, date_of_interest) discretizeMo('2012-02-01', '2013-01-01

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

myList = [datetime.date(2015,02,08), datetime.date(2015,02,25), datetime.date(2015,05,03), datetime.date(2016,03,27)]
discretizeMo(start_date, date_of_interest)
discretizeMo('2012-02-01', '2013-01-01')
由于最小年份/月份为2015/02,因此该月份等于0。下一个月2015/03为1,以此类推,直到上一个月2016/03为13

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

myList = [datetime.date(2015,02,08), datetime.date(2015,02,25), datetime.date(2015,05,03), datetime.date(2016,03,27)]
discretizeMo(start_date, date_of_interest)
discretizeMo('2012-02-01', '2013-01-01')

将返回11,等等。

好吧,因为您减少了天数,所以通常的日期算法在这里没有用处。最简单的解决方案是将年份和月份转换为规模:

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。

好吧,因为你减少了天数,所以通常的日期算法在这里没有用处。最简单的解决方案是将年和月转换为刻度:

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。

这很容易,因为一年中总有12个月:

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

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

这很容易,因为一年中总有12个月:

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

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

你可以减去年份部分,再乘以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]

你可以减去年份部分,再乘以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]

例如,如果我想在几周内将其离散化,该怎么办?我试着用一个通用公式…如果我想在几周内离散化它呢?我试着用一个通式……我试图提出一个通式,如果我想在几周内把它们离散化,结果取决于你考虑一周的开始日期。所以你必须首先做出决定。好的观点。是的,让我们假设这一天是我们用作d0的开始日期的那一天。也就是说,对于我们的例子来说,它是DATETIME.DATE(2015/02.08),也就是第0天,第0周。我试图提出一个通式,如果我想在几周内把它们离散化,结果将取决于你考虑一周的开始日期。所以你必须首先做出决定。好的观点。是的,让我们假设这一天是我们用作d0的开始日期的那一天。例如,对于我们的示例,它是datetime.date(2015,02,08),这是第0天,第0周。如果我想将时间离散为周,该怎么办?那么一年有52周。。。“但我想它会变得更复杂一些……”德奈尔补充了几个星期的答案。在那种情况下,数学会有所不同。因为月份有不同的天数,所以“年-月数学”和“日数学”是不同的。这是可行的,但它以一种相当微妙的方式依赖于这样一个事实,即Python中的时间增量被规范化为天、秒、微秒的唯一表示形式。@wim是的。这就是Python,这里的事情很简单。在其他没有这种标准化的语言中,它将是一个混乱的30/31天月、2月、非闰年、按mod 4计算的闰年、按mod 100计算的非闰年、按mod 400计算的闰年……在任何情况下,将从时间0开始的每一个日期都以天为单位,然后减去,然后将混乱计算回月份。幸运的是,没有时间,这会让事情变得更糟。如果我想把时间离散成几周呢?那么一年有52周。。。“但我想它会变得更复杂一些……”德奈尔补充了几个星期的答案。在那种情况下,数学会有所不同。因为月份有不同的天数,所以“年-月数学”和“日数学”是不同的。这是可行的,但它以一种相当微妙的方式依赖于这样一个事实,即Python中的时间增量被规范化为天、秒、微秒的唯一表示形式。@wim是的。这就是Python,这里的事情很简单。在其他没有这种标准化的语言中,它将是一个混乱的30/31天月、2月、非闰年、按mod 4计算的闰年、按mod 100计算的非闰年、按mod 400计算的闰年……在任何情况下,将从时间0开始的每一个日期都以天为单位,然后减去,然后将混乱计算回月份。幸运的是,没有时间,这会让事情变得更糟。