Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有Python函数来确定日期在一年中的哪个季度?_Python_Date - Fatal编程技术网

是否有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