2017-09-02 84 views
1

給定某個數據季度的最後一天,我想知道得到的開始和上一季度末的最簡單/乾淨的方式。獲得啓動和日期和財政年度結束

例如,給出以下日期:

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

如果本財年九月(month=9)結束,其結果應該是:

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

在另一端,如果財政一年結束於十月(月= 10)結果將是

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

原型該函數將是這樣的:

def get_range(date_in, fy_end_month): 
    pass 

回答

2

您可以定義兩個功能:一個給定日期的季度獲得,另一個用於獲取某一季度的開始和結束日期。爲了獲得上一季度的開始和結束日期,您只需從當前季度減去一個(有一些第一季度的處理)。

import datetime as dt 
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 
相關問題