有一个Python函数来确定一个date在哪一年的哪个季度?

当然,我可以自己写这个,但在重新开始之前,有一个function已经做到了这一点?

给定datetime.date的实例x(x.month-1)//3会给你季度(第一季度为0,第二季度为1,如果需要从1开始计数,则加1; – )。


原本是两个答案,多个upvoted,甚至原来接受(都是目前删除),是越野车 – 没有做-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 – 现在这看起来不是很适合你吗?)

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

我不认为date时间模块应该有每个可能的有用的日历function,但我知道我维护一个(经过充分testing的;-) datetools模块的使用我的(和其他人)项目在工作,有很多一些小function来执行所有这些日历计算 – 一些是复杂的,一些简单的,但是没有理由一遍又一遍(甚至是简单的工作)或者在这样的计算中冒着错误;-)。

我会build议另一种可以说是更干净的解决方 如果X是一个datetime.datetime.now()实例,则该季度是:

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

ceil必须从math模块导入,因为它不能被直接访问。

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

 import datetime as dt import pandas as pd quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter assert quarter == 1 

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

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

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

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

如果m是月份数字…

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

对于任何想要获得本年度季度的人来说,我都会写一个Python模块来完成这个工作。

安装很简单。 赶紧跑:

 $ pip install fiscalyear 

没有依赖关系, fiscalyear应该为Python 2和Python 3工作。

它基本上是内置date时间模块的一个包装,所以你已经熟悉的任何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托pipe在GitHub和PyPI上 。 文档可以在阅读文档中find。 如果你正在寻找它目前没有的function,请告诉我!

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

 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] 

这是一个详细的,但也是可读的解决scheme,将适用于date时间和date实例

 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