【问题标题】:relativedelta in python when working in months几个月工作时python中的relativedelta
【发布时间】:2017-03-11 08:41:07
【问题描述】:

假设我在处理月份的相对增量。

问题是当我这样做时:

x = relativedelta(months=12)
x.months
> 0

当我尝试做这样的事情时,这是一个问题:

y = relativedelta(months=12) - relativedelta(months=4)

y
> relativedelta(years=+1, months=-4)

y.months
> -4 

我希望月份值为 8 (12 - 4)。任何人都知道如何最好地解决这个问题,以便我可以实现我正在寻找的输出?

【问题讨论】:

  • relativedelta(months=12) 实际上是relativedelta(years=+1) 它会自动将月转换为年。例如months=13 将导致relativedelta(years=+1, months=+1)

标签: python relativedelta


【解决方案1】:
y = (relativedelta(months=12) - relativedelta(months=4)).months % 12

基本上,我使用模数来减轻超出范围的值(12)。

【讨论】:

    【解决方案2】:

    relativedelta(months=12) 实际上是relativedelta(years=+1) 它会自动将月转换为年。例如months=13 将导致relativedelta(years=+1, months=+1)

    此外,只有当月份低于-11或高于11时,年份才会发生变化。因此,如果操作后months的数量仍在-11和11之间,则年份不会改变。

    解决方案是您需要同时查看 rdelta.yearsrdelta.months 值以获得您正在寻找的“净月数”。

    def total_months(rdelta):
        return (rdelta.years * 12) + rdelta.months
    

    您可以将relativedelta 子类化,以使其更直观地供您使用。

    class reldelta(relativedelta):
        @property
        def total_months(self):
            return (self.years * 12) + self.months
    

    然后

    >>> delta = reldelta(years=1) - relativedelta(months=4)
    >>> delta
    reldelta(years=+1, months=-4)
    >>> delta.total_months
    8
    

    当然,如果您想将天数计算在内,这可能会变得一团糟,因为一个月中的天数会发生变化。这就是为什么days 不像月份那样有界

    >>> relativedelta(days=9999)
    relativedelta(days=+9999)
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2020-09-15
      相关资源
      最近更新 更多