有一个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