在Python中获取当前季度的第一个日期和最后一个日期



如何在Python中获得当前季度年,然后是当前季度年的第一个日期和最后一个日期?

我想要导入日期时间

import datetime

人们研究堆栈溢出需要直接的答案,这应该非常简单。你提供的哪个链接有很多评论。所以,用户必须浏览所有的评论才能找到正确的答案。我写的是简单明了的答案。

我相信目前的答案在Python 3中都不是有效的,所以由于这是本季度第一天和最后一天在谷歌上的热门,我将提供一个在Python 3(主要是Ahmet的//而不是/)中工作的解决方案:

from datetime import date as date_class
from datetime import timedelta, datetime

def get_quarter(p_date: date_class) -> int:
    return (p_date.month - 1) // 3 + 1

def get_first_day_of_the_quarter(p_date: date_class):
    return datetime(p_date.year, 3 * ((p_date.month - 1) // 3) + 1, 1)

def get_last_day_of_the_quarter(p_date: date_class):
    quarter = get_quarter(p_date)
    return datetime(p_date.year + 3 * quarter // 12, 3 * quarter % 12 + 1, 1) + timedelta(days=-1)

assert get_quarter(datetime(year=2021, month=10, day=5).date()) == 4
assert get_quarter(datetime(year=2020, month=9, day=25).date()) == 3
assert get_quarter(datetime(year=2020, month=12, day=11).date()) == 4
assert get_quarter(datetime(year=2020, month=1, day=2).date()) == 1
assert get_first_day_of_the_quarter(datetime(2020, 10, 5).date()) == datetime(2020, 10, 1)
assert get_first_day_of_the_quarter(datetime(2020, 9, 25).date()) == datetime(2020, 7, 1)
assert get_first_day_of_the_quarter(datetime(2020, 12, 11).date()) == datetime(2020, 10, 1)
assert get_first_day_of_the_quarter(datetime(2020, 1, 2).date()) == datetime(2020, 1, 1)
assert get_last_day_of_the_quarter(datetime(2020, 10, 5).date()) == datetime(2020, 12, 31)
assert get_last_day_of_the_quarter(datetime(2020, 9, 25).date()) == datetime(2020, 9, 30)
assert get_last_day_of_the_quarter(datetime(2020, 12, 11).date()) == datetime(2020, 12, 31)
assert get_last_day_of_the_quarter(datetime(2020, 1, 2).date()) == datetime(2020, 3, 31)
assert get_last_day_of_the_quarter(datetime(2020, 5, 6).date()) == datetime(2020, 6, 30)

拥有第一天与@Karishh的解决方案相同。但是,就最后一天而言,Python2.7给第四季度带来了问题。因为12+1=13,而datetime不接受13作为一个月。所以你需要做一些技巧来处理它。

import datetime

def get_quarter(date):
    return (date.month - 1) / 3 + 1
def get_first_day_of_the_quarter(date):
    quarter = get_quarter(date)
    return datetime.datetime(date.year, 3 * quarter - 2, 1)
def get_last_day_of_the_quarter(date):
    quarter = get_quarter(date)
    month = 3 * quarter
    remaining = month / 12
    return datetime.datetime(date.year + remaining, month % 12 + 1, 1) + datetime.timedelta(days=-1)

我如何在c#中找到一些简单的解决方案并将其转换为python、

from datetime import datetime,timedelta
current_date=datetime.now()
currQuarter = (current_date.month - 1) / 3 + 1
dtFirstDay = datetime(current_date.year, 3 * currQuarter - 2, 1)
dtLastDay = datetime(current_date.year, 3 * currQuarter + 1, 1) + timedelta(days=-1)

这里有一个一行/二行来获取当前季度的开始/结束日期。

from datetime import datetime
import math
from dateutil.relativedelta import relativedelta  # requires python-dateutil
start_of_quarter = datetime(year=datetime.now().year, month=((math.floor(((datetime.now().month - 1) / 3) + 1) - 1) * 3) + 1, day=1)
end_of_quarter = start_of_quarter + relativedelta(months=3, seconds=-1)

pendulum有一个更直观的实现。

import pendulum
dt = pendulum.datetime(2021, 3, 23)
print(dt.first_of('quarter'))
print(dt.last_of('quarter'))
2021-01-01T00:00:00+00:00
2021-03-31T00:00:00+00:00

基于Krishh的答案,但解决了发现的几个问题:

  1. 计算第4季度的最后一天
  2. Wasae Shoaib关于提出ValueError的评论
  3. 传递浮点值而不是整数的TypeError

使用relativedeta,并将正确计算的开始日期更改三个月,我们最终获得了一种更可靠的方法来确定季度结束日期。

from datetime import datetime
from dateutil.relativedelta import relativedelta
current_date = datetime.now()
currQuarter = int((current_date.month - 1) / 3 + 1)
dtFirstDay = datetime(current_date.year, 3 * currQuarter - 2, 1)
dtLastDay = dtFirstDay + relativedelta(months=3, days=-1)

我做了很多测试来找到符合我需求的解决方案,如果它能帮助其他人,我会很高兴:

            datval = fields.date.today()
            if datval.month < 4 :
               self.start_date = fields.date.today().replace(month=10, day=1)
               self.end_date = fields.date.today().replace(month=12, day=31)
            elif datval.month < 7 :
               self.start_date = fields.date.today().replace(month=1, day=1)
               self.end_date = fields.date.today().replace(month=3, day=31)
            elif datval.month < 10 :
               self.start_date = fields.date.today().replace(month=4, day=1)
               self.end_date = fields.date.today().replace(month=6, day=30)
            else : 
               self.start_date = fields.date.today().replace(month=7, day=1)
               self.end_date = fields.date.today().replace(month=9, day=30)

获取周、月、季度和年的开始点和结束点https://gist.github.com/dejurin/236b398dc4b8064685702a27a3df612b

from datetime import date
from dateutil.relativedelta import relativedelta
def start_end_day(sunmon: bool = True):
    today = date.today()
    curr_quarter = int((today.month - 1) / 3 + 1)
    
    dayofweek = [today.weekday(),today.isoweekday()][sunmon]
    
    week_start = today - relativedelta(days=dayofweek)
    week_end = week_start + relativedelta(days=6)
    
    month_start = date(today.year,today.month, 1)
    month_end = month_start + relativedelta(months=1, days=-1)
    
    quarter_start = date(today.year, 3 * curr_quarter - 2, 1)
    quarter_end = quarter_start + relativedelta(months=3, days=-1)
    
    year_start = date(today.year, 1, 1)
    year_end = year_start + relativedelta(years=1, days=-1)
    
    return ((week_start,week_end),(month_start,month_end),(quarter_start,quarter_end),(year_start,year_end))
"""
Current date: 18/02/2022
"""
"""
((datetime.date(2022, 2, 13), datetime.date(2022, 2, 19)),
 (datetime.date(2022, 2, 1), datetime.date(2022, 2, 28)),
 (datetime.datetime(2022, 1, 1, 0, 0), datetime.datetime(2022, 3, 31, 0, 0))
  (datetime.date(2022, 1, 1), datetime.date(2022, 12, 31)))
"""

相关内容

最新更新