是否有Python函数来确定一年中的哪个季度?

Jas*_*sta 91 python date

当然我可以自己写这个,但在我重新发明轮子之前是否已经有了这个功能?

Ale*_*lli 139

给定一个实例xdatetime.date,(x.month-1)//3会给你的四分之一(0第一季度,1第二季度,等等-加1,如果你需要从1计数,而不是;-).


最初有两个答案,乘以upvoted甚至最初接受(目前都已删除),都是错误的 - 没有-1在分割之前做,而是除以4而不是3.自从.month1到12之后,很容易检查自己是什么公式对:

for m in range(1, 13):
  print m//4 + 1,
print
Run Code Online (Sandbox Code Playgroud)

给出1 1 1 2 2 2 2 3 3 3 3 4- 两个四个月的季度和一个月的一个月(eep).

for m in range(1, 13):
  print (m-1)//3 + 1,
print
Run Code Online (Sandbox Code Playgroud)

给出1 1 1 2 2 2 3 3 3 4 4 4- 现在这看起来不是很适合你? - )

这证明了这个问题是有道理的,我认为;-).

我不认为datetime模块应该具有所有可能的有用的日历功能,但我知道我维护一个(经过良好测试的;-)datetools模块,用于在工作中使用我的(和其他人)项目,这有很多函数来执行所有这些日历计算 - 有些是复杂的,有些简单,但没有理由一遍又一遍地完成工作(甚至是简单的工作)或冒这样计算的风险;-).

  • 也可以使用:(m + 2)// 3代替(m-1)// 3 +1 (4认同)
  • 谢谢Alex.这就是为什么应该有一个功能.看看有多少人弄错了. (3认同)
  • @JG,什么“重复评论”?随着有问题的答案被删除,评论也随之消失,所以我将它们的内容带入答案中 - 重要的是要意识到即使在简单的计算中也很容易分心或匆忙并获得可避免的错误,它对编程最佳实践有影响(在制作和可靠测试可重用函数方面);这个案例就是一个很好的例子(我认为这证明了这个问题是有道理的)。 (2认同)

chi*_*aku 34

如果你已经在使用pandas,那很简单.

import datetime as dt
import pandas as pd

quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter
assert quarter == 1
Run Code Online (Sandbox Code Playgroud)

如果date数据框中有列,则可以轻松创建新quarter列:

df['quarter'] = df['date'].dt.quarter
Run Code Online (Sandbox Code Playgroud)


小智 27

我建议另一个可以说更清洁的解决方案.如果X是一个datetime.datetime.now()实例,则该季度为:

import math
Q=math.ceil(X.month/3.)
Run Code Online (Sandbox Code Playgroud)

ceil必须从数学模块导入,因为它无法直接访问.

  • 可能应该将它包装在int()中 (3认同)

Ada*_*art 9

对于任何试图获得会计年度的季度(可能与日历年不同)的人,我写了一个Python模块来做这件事.

安装很简单.赶紧跑:

$ pip install fiscalyear
Run Code Online (Sandbox Code Playgroud)

没有依赖关系,并且fiscalyear应该适用于Python 2和3.

它基本上是内置日期时间模块的包装器,因此datetime您熟悉的任何命令都可以使用.这是一个演示:

>>> from fiscalyear import *
>>> a = FiscalDate.today()
>>> a
FiscalDate(2017, 5, 6)
>>> a.fiscal_year
2017
>>> a.quarter
3
>>> b = FiscalYear(2017)
>>> b.start
FiscalDateTime(2016, 10, 1, 0, 0)
>>> b.end
FiscalDateTime(2017, 9, 30, 23, 59, 59)
>>> b.q3
FiscalQuarter(2017, 3)
>>> b.q3.start
FiscalDateTime(2017, 4, 1, 0, 0)
>>> b.q3.end
FiscalDateTime(2017, 6, 30, 23, 59, 59)
Run Code Online (Sandbox Code Playgroud)

fiscalyear托管在GitHubPyPI上.可以在阅读文档中找到文档.如果您正在寻找目前没有的任何功能,请告诉我们!


gar*_*zio 6

如果m是月份数...

import math
math.ceil(float(m) / 3)
Run Code Online (Sandbox Code Playgroud)


Jav*_*Gom 6

这非常简单并且适用于 python3:

from datetime import datetime

# Get current date-time.
now = datetime.now()

# Determine which quarter of the year is now. Returns q1, q2, q3 or q4.
quarter_of_the_year = f'q{(now.month-1)//3+1}'
Run Code Online (Sandbox Code Playgroud)


Sid*_*m H 5

对于那些正在使用 Pandas 寻找财政年度季度数据的人,

import datetime
import pandas as pd
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
Run Code Online (Sandbox Code Playgroud)

参考资料: 熊猫时期指数


Uri*_*ren 5

此方法适用于任何映射:

month2quarter = {
        1:1,2:1,3:1,
        4:2,5:2,6:2,
        7:3,8:3,9:3,
        10:4,11:4,12:4,
    }.get
Run Code Online (Sandbox Code Playgroud)

我们刚刚生成了一个函数int->int

month2quarter(9) # returns 3
Run Code Online (Sandbox Code Playgroud)

这个方法也是万无一失的

month2quarter(-1) # returns None
month2quarter('July') # returns None
Run Code Online (Sandbox Code Playgroud)


Roe*_*umi 5

下面是一个获取 datetime.datetime 对象并为每个季度返回一个唯一字符串的函数示例:

from datetime import datetime, timedelta

def get_quarter(d):
    return "Q%d_%d" % (math.ceil(d.month/3), d.year)

d = datetime.now()
print(d.strftime("%Y-%m-%d"), get_q(d))

d2 = d - timedelta(90)
print(d2.strftime("%Y-%m-%d"), get_q(d2))

d3 = d - timedelta(180 + 365)
print(d3.strftime("%Y-%m-%d"), get_q(d3))
Run Code Online (Sandbox Code Playgroud)

输出是:

2019-02-14 Q1_2019
2018-11-16 Q4_2018
2017-08-18 Q3_2017
Run Code Online (Sandbox Code Playgroud)