繁体   English   中英

从日期和财政年度结束获取季度的开始和结束日期

[英]Get start and end date of quarter from date and fiscal year end

给定某个数据,我想知道获得上一季度开始和结束的最简单/最干净的方法。

例如,给定以下日期:

from datetime import datetime
example_date = datetime.strptime('2017-05-12', '%Y-%m-%d')

如果会计年度在 9 month=9结束 ( month=9 ),结果应该是:

datetime.datetime(2017,01,01), datetime.datetime(2017,03,31)

另一方面,如果财政年度在 10 月(月 = 10)结束,结果将是

datetime.datetime(2017,02,01), datetime.datetime(2017,04,30)

该函数的原型将是这样的:

def get_range(date_in, fy_end_month):
  pass

您可以定义两个函数:一个用于获取给定日期的季度,另一个用于获取给定季度的开始和结束日期。 要获得上一季度的开始和结束日期,您只需要从当前季度中减去一个(对第一季度进行一些处理)。

import datetime as dt
from dateutil import parser
from dateutil.relativedelta import relativedelta

def get_quarter(date):
    """
    Returns the calendar quarter of `date`
    """
    return 1+(date.month-1)//3

def quarter_start_end(quarter, year=None):
    """
    Returns datetime.daet object for the start
    and end dates of `quarter` for the input `year`
    If `year` is none, it defaults to the current
    year.
    """
    if year is None:
        year = dt.datetime.now().year
    d = dt.date(year, 1+3*(quarter-1), 1)
    return d, d+relativedelta(months=3, days=-1)

一旦定义了这些,我们就可以定义一个简单的函数来获取上一季度的数据。

def prev_quarter_range(date):
    """
    Returns the start and end dates of the previous quarter
    before `date`.
    """
    if isinstance(date, str):
        date = parser.parse(date)
    year = date.year
    q = get_quarter(date)-1
    # logic to handle the first quarter case
    if q==0:
       q = 4
       year -= 1
    return quarter_start_end(q, year)

现在您可以将返回的日期分配给变量

prev_q_start, prev_q_end = prev_quarter_range('2-feb-2011')

print(prev_q_start)
print(prev_q_end)

# prints:
2010-10-01
2010-12-31

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM