如何在Python中获取当前季度的星期数?

戴夫·戴维斯(Dave Davis)

我遍历了每个问题,并且每个第三方库都试图找出一种无需手动映射日期的方法。

我正在尝试获取当前财政季度的星期数。每个季度从1月,4月,7月或10月1日开始。

给定日期(字符串或对象,没关系),我需要能够计算出其所在的财政季度的周数。

更复杂的是,会计年度从4月开始。

因此,例如,今天,2020年7月9日是本财政季度(Q2)的第二周,因为该季度始于4月。同样,2020年6月29日至30日是第一季度的第14周。

大多数时间格式库甚至标准库都具有ISO日期之类的方法,在这些方法中我可以精确地提取周数。但这是从一年的第一天开始的星期数。

我不能使用算术来简单地删除到当前日期的星期数,因为每个季度有不同的星期数。根据年份,每个季度可以有12、13或14周。

我最近得到的是使用FiscalYear库,它很棒,因为它带有一个Fiscal Quarter类。不幸的是,继承的方法isoformat()不适用于它。只有FiscalDate类,它没有给我我所需要的四分之一。

有人碰到这个吗?有人可以指出我正确的方向吗?

我会发布代码片段,但这只是Python中获取当前星期数的100种方式(到今天为止,是28)。

我已经尝试在dateutils中使用rrules和deltas,但是我能得到的最接近的是使用偏移量的第一季度的周数。第二季度,它分崩离析。

我很高兴使用pandas或任何其他第三方库,如果它可以帮助我避免对季度日期或周数到日期的映射进行硬编码。

朝正确方向的任何帮助将不胜感激。


编辑:以下所有三个答案以不同的方式为我解决了此问题。我很难与哪个人给出正确的答案,但我还是把它交给了@Paul的答案,因为这是我作为一个不是高年级的人时最容易得到的答案。这也是与我的个人用例(我没有提到)相吻合的答案,该用例正在接收日期时间对象并获得结果。这样就给了它优势。抱歉,其他人提供了惊人的答案。我很高兴能得到我所希望的代码,以便在正确的方向上轻按。谢谢你们。

保罗

除非这是一种计算周数的非常常用的方法,否则我不知道您是否会找到一个可以完全为您做到这一点的库,但是使用dateutilsrelativedelta和一些逻辑即可轻松完成这是一个返回元组的简单实现(quarter, week)因为您说Q1从4月1日开始,所以我假设从1月1日到4月1日的时间称为Q0:

from datetime import date, datetime, timedelta
import typing

from dateutil import relativedelta

NEXT_MONDAY = relativedelta.relativedelta(weekday=relativedelta.MO)
LAST_MONDAY = relativedelta.relativedelta(weekday=relativedelta.MO(-1))
ONE_WEEK = timedelta(weeks=1)


def week_in_quarter(dt: datetime) -> typing.Tuple[int, int]:
    d: date = dt.date()
    year = d.year

    # Q0 = January 1, Q1 = April 1, Q2 = July 1, Q3 = October 1
    quarter = ((d.month - 1) // 3)
    quarter_start = date(year, (quarter * 3) + 1, 1)
    quarter_week_2_monday = quarter_start + NEXT_MONDAY

    if d < quarter_week_2_monday:
        week = 1
    else:
        cur_week_monday = d + LAST_MONDAY
        week = int((cur_week_monday - quarter_week_2_monday) / ONE_WEEK) + 2

    return quarter, week

哪个返回:

$ python week_in_quarter.py 
2020-01-01: Q0-W01
2020-02-01: Q0-W05
2020-02-29: Q0-W09
2020-03-01: Q0-W09
2020-06-30: Q1-W14
2020-07-01: Q2-W01
2020-09-04: Q2-W10
2020-12-31: Q3-W14

如果我误解了日历年的第一季度,并且实际上是将X年1月1日至4月1日视为X-1年Q4的情况,那么您可以将return quarter, week行结尾更改为此(并更改返回类型注释):

if quarter == 0:
    year -= 1
    quarter = 4

return year, quarter, week

这会将返回值更改为:

$ python week_in_quarter.py 
2020-01-01: FY2019-Q4-W01
2020-02-01: FY2019-Q4-W05
2020-02-29: FY2019-Q4-W09
2020-03-01: FY2019-Q4-W09
2020-06-30: FY2020-Q1-W14
2020-07-01: FY2020-Q2-W01
2020-09-04: FY2020-Q2-W10
2020-12-31: FY2020-Q3-W14

如果这是一个速度瓶颈,那么编写不使用它的优化版本应该很容易dateutil.relativedelta,而是根据星期几,一年中的某天以及是否是a年(如果您可以尽可能早地将其转换为整数运算,则Python中的日历计算通常会更快),但我怀疑在大多数情况下,此版本应该最容易阅读和理解。

如果您想避免对的依赖dateutil,则可以使用NEXT_MONDAY替换LAST_MONDAY使用简单的函数:

def next_monday(dt: date) -> date:
    weekday = dt.weekday()
    return dt + timedelta(days=(7 - weekday) % 7)

def last_monday(dt: date) -> date:
    weekday = dt.weekday()
    return dt - timedelta(days=weekday)

在这种情况下,您将分别_mondayquarter_week_2_monday = next_monday(quarter_start)分配两个变量cur_week_monday = last_monday(dt)

注意:如果我正在编写此函数,则可能不希望它返回一个整数的元组,而是使用attrs数据类为此目的创建一个简单的类,如下所示:

import attr

@attr.s(auto_attribs=True, frozen=True, slots=True)
class QuarterInWeek:
    year: int
    quarter: int
    week: int

    def __str__(self):
        return f"FY{self.year}-Q{self.quarter}-W{self.week:02d}"

(请注意,这slots=True是可选的,如果使用dataclasses.dataclass,我认为它不可用-只是这是一个简单的结构,我倾向于将slot类用于简单的结构)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Swift 3中获取当前星期数?

如何在python上获取星期数?

如何在R中从日期获取星期数和年份

如何在Java中获取连续的星期数和年份?

如何在google-apps-script中获取星期数

如何在Oracle查询中查找从开始日期到当前星期结束的星期数?

如何在python中获取从给定年份到当前日期的季度期间?

如何基于python中的星期数获取星期的所有日期

如何从PostgreSQL中的星期数获取星期开始日期?

如何在javascript中获取当前星期日期?

Python按月获取星期数

如何在目标c中获取起始和结束日期的星期数

如何在SQL Server中获取“完成年份”的星期数,开始日期和结束日期?

如何在Excel中获取当前星期一,星期三和当前星期几的日期?

如何从星期数,天数和年份中获取日期?

如何在python中获取季度开始日期

如何在Hive中按年的星期数获取星期的开始日期?一周的第一天应该是星期一

如何在mysql中使用星期数获取开始和结束星期的日期?

如何在Android中获取“当前周”详细信息以及“季度详细信息”?

如何在SQL Server中获取当前/今天的日期数据

gnuplot:如何获取正确的星期数?

从日期获取年份中的星期数

从Google表格中的星期数获取日期

从数据框中的列获取星期数

如何在R中获取当前周开始日期(星期一)和结束日期(星期日)

Python-从星期几,年份和星期数获取日期

在PHP中获取星期几及其星期数

如何在Python中获取当前时间

如何在Google表格中按季度和年份计算日期数量?