是否有Python函数来确定日期在一年中的哪个季度?
当然我可以自己写,但是在我重新发明轮子之前,有没有一个函数已经做到了这一点呢?给定一个实例,是否有Python函数来确定日期在一年中的哪个季度?,python,date,Python,Date,当然我可以自己写,但是在我重新发明轮子之前,有没有一个函数已经做到了这一点呢?给定一个实例,(x.month-1)//3会给你一个季度(第一季度0,第二季度1,等等——如果你需要从1开始计算,就加上1;-) 最初的两个答案,乘法向上投票,甚至最初被接受(目前都已删除),都是错误的——在除法之前没有做-1,而是被4除法,而不是3除法。由于.month从1到12,您很容易自己检查什么公式是正确的: 适用于范围(1,13)内的m: 打印m//4+1, 打印 给出了1 2 2 3 3 4——两个四个
(x.month-1)//3
会给你一个季度(第一季度0,第二季度1,等等——如果你需要从1开始计算,就加上1;-)
最初的两个答案,乘法向上投票,甚至最初被接受(目前都已删除),都是错误的——在除法之前没有做
-1
,而是被4除法,而不是3除法。由于.month
从1到12,您很容易自己检查什么公式是正确的:
适用于范围(1,13)内的m:
打印m//4+1,
打印
给出了1 2 2 3 3 4
——两个四个月的季度和一个单月的季度(eep)
适用于范围(1,13)内的m:
打印(m-1)//3+1,
打印
给出了1 1 2 3 3 4 4 4
——这看起来不是非常适合您吗?-)
这证明这个问题是有充分理由的,我认为;-)
我不认为datetime模块应该具有所有可能有用的日历功能,但我知道我维护了一个(经过良好测试的;-)
datetools
模块,供我(和其他人)在工作中使用,它有许多小功能来执行所有日历计算——有些复杂,有些简单,但是,没有理由反复做这些工作(即使是简单的工作),也没有理由在这样的计算中冒错误的风险;-) hmmm所以计算可能出错,这里有一个更好的版本(只是为了它)
我会建议另一个可以说更干净的解决方案。如果X是一个
datetime.datetime.now()
实例,则季度为:
import math
Q=math.ceil(X.month/3.)
ceil必须从数学模块导入,因为它不能直接访问 这是一个老问题,但仍然值得讨论 这是我的解决方案,使用优秀的模块
因此,
第一天
是季度的第一天,最后一天
是季度的最后一天(通过查找下一季度的第一天减去一天来计算)。如果m
是月数
import math
math.ceil(float(m) / 3)
如果您已经在使用
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
对于任何试图获取财年季度(可能与日历年不同)的人,我编写了一个Python模块来实现这一点 安装很简单。只需运行:
$ pip install fiscalyear
没有依赖项,fiscalyear
应该适用于Python2和Python3
它基本上是内置模块的包装器,因此您已经熟悉的任何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
位于和上。有关文件,请访问。如果您正在寻找它目前没有的任何功能,请告诉我 这是一个详细但可读的解决方案,可用于datetime和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
对于那些正在寻找财政年度季度数据的人, 使用熊猫
import datetime
import pandas as pd
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
参考:
此方法适用于任何映射:
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
以下是获取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
使用字典,你可以通过
def get_quarter(month):
quarter_dictionary = {
"Q1" : [1,2,3],
"Q2" : [4,5,6],
"Q3" : [7,8,9],
"Q4" : [10,11,12]
}
for key,values in quarter_dictionary.items():
for value in values:
if value == month:
return key
print(get_quarter(3))
这非常简单,在python3中有效:
从日期时间导入日期时间
#获取当前日期时间。
now=datetime.now()
#确定现在是一年中的哪个季度。返回q1、q2、q3或q4。
年的季度='q'+str((现在的.month-1)//3+1)
我用x//3+1和x//4+1尝试了解决方案,
在这两种情况下,我们得到的季度都不正确。
正确答案是这样的
for i in range(1,13):
print(((i-1)//3)+1)
谢谢你,亚历克斯。这就是为什么应该有一个函数。看看有多少人弄错了。我想你证明了你的观点。没有必要用重复的评论来污染整个页面。@Jason,是的,没错——这就是为什么当我看到其他错误的答案(目前已删除)时,我对你的问题投了更高的票,尽管其他人似乎对我的高票投了更低的票,啊。@JG,“重复评论”是什么?由于错误答案被删除了,评论也随之消失了,所以我把它们的内容带到了答案中——重要的是要意识到,即使是在一个简单的计算中,也很容易分心或匆忙地得到一个可以避免的错误,并且它会产生后果(在生成和可靠地测试可重用函数方面)规划最佳做法;这个案例是一个很好的例子(我认为这证明了这个问题是有道理的)。也可以使用:
(m+2)//3
而不是(m-1)//3+1
@RussBradberry在这个案例中,您可能是对的,但有时可读性和明确性会导致更少的错误,而不是简明扼要calculation@RussBradberry也可以看到删除的答案和评论,看到一个简单的计算对优秀的程序员来说也是很棘手的,除非通过测试它,否则很难看到正确性,在我的解决方案中,你可以看到并确保它会像你说的那样工作“除非通过测试,否则很难看到正确性“
。您应该像所有优秀的开发人员一样编写测试。考试有助于防止你犯错误,并抓住你所犯的错误。开发人员永远不应该牺牲性能和可读性,以防止自己犯错误。另外,这比仅仅使用文本制作静态dict可读性差。别误会(m-1)//3+1
也不是那么可读,没有多少人知道/
做什么。我最初的评论是关于“计算可能出错”
,这听起来很奇怪。@RussBradberry实际上我同意你的看法
def get_quarter(month):
quarter_dictionary = {
"Q1" : [1,2,3],
"Q2" : [4,5,6],
"Q3" : [7,8,9],
"Q4" : [10,11,12]
}
for key,values in quarter_dictionary.items():
for value in values:
if value == month:
return key
print(get_quarter(3))
for m in range(1, 13):
print ((m*3)//10)
for i in range(1,13):
print(((i-1)//3)+1)
import datetime
def get_quarter_number_and_date_from_choices(p_quarter_choice):
"""
:param p_quarter_choice:
:return:
"""
current_date = datetime.date.today()
# current_quarter = current_date.month - 1 // 3 + 1
if p_quarter_choice == 'Q1':
quarter = 1
q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
q_end_date = datetime.datetime(current_date.year, 3 * quarter + 1, 1) + datetime.timedelta(days=-1)
return q_start_date, q_end_date
elif p_quarter_choice == 'Q2':
quarter = 2
q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
q_end_date = datetime.datetime(current_date.year, 3 * quarter + 1, 1) + datetime.timedelta(days=-1)
return q_start_date, q_end_date
elif p_quarter_choice == 'Q3':
quarter = 3
q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
q_end_date = datetime.datetime(current_date.year, 3 * quarter + 1, 1) + datetime.timedelta(days=-1)
return q_start_date, q_end_date
elif p_quarter_choice == 'Q4':
quarter = 4
q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
q_end_date = datetime.datetime(current_date.year, 3 * quarter, 1) + datetime.timedelta(days=30)
return q_start_date, q_end_date
return None