代码之家  ›  专栏  ›  技术社区  ›  Jason Christa

是否有一个python函数来确定日期在一年中的哪个季度?

  •  73
  • Jason Christa  · 技术社区  · 15 年前

    当然我可以自己写这个,但是在我重新发明轮子之前,有一个函数已经在做这个了吗?

    11 回复  |  直到 5 年前
        1
  •  125
  •   fedorqui yar    7 年前

    给定一个实例 x 属于 datetime.date , (x.month-1)//3 将给出季度(第一季度为0,第二季度为1,等等--如果需要从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 用于在工作中使用我(和其他人)项目的模块,它有许多小的功能来执行所有这些日历计算——一些是复杂的,一些是简单的,但没有理由反复进行工作(甚至是简单的工作),或者在此类计算中存在错误风险;-。

        2
  •  27
  •   chishaku    8 年前

    如果 您已经在使用 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
    
        3
  •  22
  •   CrazyProgrammer Jonathan Rocher    10 年前

    我建议另一个可以说更清洁的解决方案。如果x是 datetime.datetime.now() 例如,那么季度是:

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

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

        4
  •  5
  •   Adam Stewart    7 年前

    任何想得到 财政 年份,可能与 日历 年,我编写了一个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)
    

    花萼 托管在 GitHub PyPI . 文档可在 Read the Docs . 如果您正在寻找它目前没有的任何功能,请告诉我!

        5
  •  2
  •   garbanzio    9 年前

    如果 m 是月份号…

    import math
    math.ceil(float(m) / 3)
    
        6
  •  1
  •   MikeHoss    12 年前

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

    这是我的解决方案,使用优秀的 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 是季度的最后一天(通过查找下一季度的第一天减去一天计算)。

        7
  •  1
  •   Siddaram H    6 年前

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

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

    参考文献: pandas period index

        8
  •  0
  •   Anurag Uniyal    15 年前

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

    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
  •   igniteflow    7 年前

    这里有一个详细但可读的解决方案,可以用于日期时间和日期实例。

    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
  •   Uri Goren    6 年前

    此方法适用于任何映射:

    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
  •   Roei Bahumi    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))
    

    输出为:

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