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

时间:2009-09-10 15:54:08

标签: python date

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

16 个答案:

答案 0 :(得分:131)

鉴于datetime.date的实例x(x.month-1)//3将为您提供季度(第一季度为0,第二季度为1,等等 - 如果您需要从1代替; - )。


最初有两个答案,即倍数上调甚至最初接受(目前都已删除),都是错误的 - 在分割前没有-1,而是除以4而不是3.自.month开始1到12,很容易检查自己的公式是对的:

for m in range(1, 13):
  print m//4 + 1,
print

给出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

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

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

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

答案 1 :(得分:31)

IF 您已使用pandas,这很简单。

import datetime as dt
import pandas as pd

quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter
assert quarter == 1

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

df['quarter'] = df['date'].dt.quarter

答案 2 :(得分:23)

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

import math
Q=math.ceil(X.month/3.)

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

答案 3 :(得分:7)

对于任何想要获得财政年度四分之一的人,可能与 calendar 年不同,我写了一个Python模块来做这件事。

安装很简单。跑吧:

$ pip install fiscalyear

没有依赖项,fiscalyear应该适用于Python 2和3。

它基本上是内置datetime模块的包装器,因此您熟悉的任何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)

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

答案 4 :(得分:2)

如果m是月份编号...

import math
math.ceil(float(m) / 3)

答案 5 :(得分:1)

这是一个老问题,但仍值得讨论。

这是我的解决方案,使用优秀的dateutil模块。

  from dateutil import rrule,relativedelta

   year = this_date.year
   quarters = rrule.rrule(rrule.MONTHLY,
                      bymonth=(1,4,7,10),
                      bysetpos=-1,
                      dtstart=datetime.datetime(year,1,1),
                      count=8)

   first_day = quarters.before(this_date)
   last_day =  (quarters.after(this_date)
                -relativedelta.relativedelta(days=1)

所以first_day是本季度的第一天,last_day是该季度的最后一天(通过查找下一季度的第一天,减去一天来计算)。

答案 6 :(得分:1)

对于那些正在寻找会计年度季度数据的人, 使用熊猫

import datetime
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')

参考: pandas period index

答案 7 :(得分:1)

我尝试了 x//3+1 和 x//4+1 的解决方案, 在任何一种情况下,我们都会得到不正确的季度。 正确答案是这样的

for i in range(1,13):
  print(((i-1)//3)+1) 

答案 8 :(得分:0)

嗯,所以计算可能会出错,这是一个更好的版本(仅仅是为了它)

first, second, third, fourth=1,2,3,4# you can make strings if you wish :)

quarterMap = {}
quarterMap.update(dict(zip((1,2,3),(first,)*3)))
quarterMap.update(dict(zip((4,5,6),(second,)*3)))
quarterMap.update(dict(zip((7,8,9),(third,)*3)))
quarterMap.update(dict(zip((10,11,12),(fourth,)*3)))

print quarterMap[6]

答案 9 :(得分:0)

这是一个详细但可读的解决方案,适用于日期时间和日期实例

def get_quarter(date):
    for months, quarter in [
        ([1, 2, 3], 1),
        ([4, 5, 6], 2),
        ([7, 8, 9], 3),
        ([10, 11, 12], 4)
    ]:
        if date.month in months:
            return quarter

答案 10 :(得分:0)

此方法适用于任何映射:

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

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

month2quarter(9) # returns 3

此方法也很简单

month2quarter(-1) # returns None
month2quarter('July') # returns None

答案 11 :(得分:0)

这是一个获取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))

输出为:

2019-02-14 Q1_2019
2018-11-16 Q4_2018
2017-08-18 Q3_2017

答案 12 :(得分:0)

使用字典,您可以通过

mydict2 = {k: v[1] for k, v in mydict.items()}

答案 13 :(得分:0)

这非常简单,并且可以在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 = 'q'+str((now.month-1)//3+1)

答案 14 :(得分:0)

for m in range(1, 13):
  print ((m*3)//10)

答案 15 :(得分:0)

shifted = String(shiftArray)
// shifted is 'rgw myuxj veiqb diz hynoa icwe rgw kplt sif'