计算上一季度的结束

dge*_*gel 3 python

我正在寻找一种优雅和pythonic的方式来获得上一季度结束的日期.

像这样的东西:

def previous_quarter(reference_date):
   ...


>>> previous_quarter(datetime.date(2013, 5, 31))
datetime.date(2013, 3, 31)

>>> previous_quarter(datetime.date(2013, 2, 1))
datetime.date(2012, 12, 31)

>>> previous_quarter(datetime.date(2013, 3, 31))
datetime.date(2012, 12, 31)

>>> previous_quarter(datetime.date(2013, 11, 1))
datetime.date(2013, 9, 30)
Run Code Online (Sandbox Code Playgroud)

编辑:我尝试过什么吗?

是的,这似乎有效:

def previous_quarter(ref_date):
    current_date = ref_date - timedelta(days=1)
    while current_date.month % 3:
        current_date -= timedelta(days=1)
    return current_date
Run Code Online (Sandbox Code Playgroud)

但它似乎是不必要的迭代.

Jus*_*ier 8

只需查看您收到的月份,您就可以通过"艰难的方式"来做到这一点:

def previous_quarter(ref):
    if ref.month < 4:
        return datetime.date(ref.year - 1, 12, 31)
    elif ref.month < 7:
        return datetime.date(ref.year, 3, 31)
    elif ref.month < 10:
        return datetime.date(ref.year, 6, 30)
    return datetime.date(ref.year, 9, 30)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢它——干净、简单、有效。 (2认同)

unu*_*tbu 5

使用dateutil

import datetime as DT
import dateutil.rrule as rrule

def previous_quarter(date):
    date = DT.datetime(date.year, date.month, date.day)
    rr = rrule.rrule(
        rrule.DAILY,
        bymonth=(3,6,9,12),    # the month must be one of these
        bymonthday=-1,         # the day has to be the last of the month
        dtstart = date-DT.timedelta(days=100))
    result = rr.before(date, inc=False)  # inc=False ensures result < date
    return result.date()

print(previous_quarter(DT.date(2013, 5, 31)))
# 2013-03-31
print(previous_quarter(DT.date(2013, 2, 1)))
# 2012-12-31
print(previous_quarter(DT.date(2013, 3, 31)))
# 2012-12-31
print(previous_quarter(DT.date(2013, 11, 1)))
# 2013-09-30
Run Code Online (Sandbox Code Playgroud)