क्या यह निर्धारित करने के लिए कि वर्ष की किस तिमाही में एक पायथन कार्य है?


113

निश्चित रूप से मैं इसे स्वयं लिख सकता था, लेकिन इससे पहले कि मैं पहिया को सुदृढ़ करूं क्या कोई फ़ंक्शन है जो पहले से ही ऐसा करता है?


22
प्रश्न बहुत जल्दी भले ही प्रारंभिक उत्तर प्रतीत होता हो ("बस की बात है," बहुत सरल लगता है "): दो उत्तर (एक अपवादात्मक एक सहित!) बहुत ही भयानक हैं, यह दिखाते हुए कि यह उतना सरल या" नहीं "है। बस "...
एलेक्स मार्टेली 16

मुझे यकीन है कि वह वापस आ जाएगा और इसे ठीक कर देगा
नादिया अल्रामली

यह सवाल 2018 में बहुत मददगार है: D
wccc

यदि डेटाटाइम ऑब्जेक्ट पंडों श्रृंखला या डेटाफ़्रेम में संग्रहीत हैं , तो एक विधि है जो संबंधित तिमाही (एस) को लौटाती है pandas.Series.dt.quarter:।
सुमंत लाजर

जवाबों:


162

एक उदाहरण को देखते हुए xकी datetime.date , (x.month-1)//3आप तिमाही (0 पहली तिमाही के लिए दूसरी तिमाही के लिए, आदि दे देंगे, 1 - 1 जोड़ें यदि आपने ;-) बजाय 1 से गिनती करने के लिए की जरूरत है।


मूल रूप से दो उत्तर, बहुतायत से उत्कीर्ण और यहां तक ​​कि मूल रूप से स्वीकार किए गए (दोनों वर्तमान में हटाए गए), छोटी थीं - -1विभाजन से पहले नहीं कर रहे थे , और 4 के बजाय 4 से विभाजित कर रहे थे । .month1 से 12 तक जाने के बाद , अपने आप को जांचना आसान है कि सूत्र क्या है सही:

for m in range(1, 13):
  print m//4 + 1,
print

देता है 1 1 1 2 2 2 2 3 3 3 3 4- दो चार महीने का क्वार्टर और एक महीने का एक (ईप)।

for m in range(1, 13):
  print (m-1)//3 + 1,
print

देता है 1 1 1 2 2 2 3 3 3 4 4 4- अब यह आपको बहुत पसंद नहीं है? -)

यह साबित करता है कि प्रश्न अच्छी तरह से वारंट है, मुझे लगता है; ;-)

मुझे नहीं लगता कि डेटाटाइम मॉड्यूल के लिए आवश्यक रूप से हर संभव उपयोगी कैलेंड्रिक फ़ंक्शन होना चाहिए, लेकिन मुझे पता है कि मैं काम पर एक (अच्छी तरह से परीक्षण किया ;-) datetoolsमॉड्यूल) का उपयोग अपने (और अन्य) परियोजनाओं के लिए करता हूं, जिसमें बहुत कम है इन सभी कैलेंड्रिक अभिकलनों को पूरा करने के लिए कार्य - कुछ जटिल हैं, कुछ सरल हैं, लेकिन इस तरह के अभिकलन में कार्य को बार-बार (यहां तक ​​कि सरल कार्य) या जोखिम कीड़े करने का कोई कारण नहीं है ;-)।


3
धन्यवाद एलेक्स। यही कारण है कि एक समारोह होना चाहिए। देखो कितने लोगों को यह गलत लगा।
जेसन क्रिस्टा सेप

मुझे लगता है कि आपने अपनी बात साबित कर दी। बार-बार टिप्पणी के साथ पूरे पृष्ठ को प्रदूषित करना अनावश्यक है।
जोहो सिल्वा

1
@ जेसन, हां, बिल्कुल - इसीलिए मैंने आपके सवाल को एक बार बढ़ा दिया, जब मैंने अन्य छोटी गाड़ी के उत्तरों (वर्तमान में हटाए गए) को देखा, भले ही किसी और को मेरे अपवॉट, आह अच्छी तरह से गिना गया लगता है।
एलेक्स मार्टेली सेप

1
@ जेजी, क्या "बार-बार टिप्पणी"? जैसा कि छोटी गाड़ी के उत्तर हटा दिए गए थे, टिप्पणियाँ उनके साथ चली गईं, इसलिए मैं उनकी सामग्री को उत्तर में लाया - यह जानना महत्वपूर्ण है कि विचलित या जल्दबाजी करना कितना आसान है और एक साधारण संगणना में भी एक परिहार्य बग प्राप्त करें, और इसका सबसे अच्छा अभ्यास करने के लिए परिणाम (बनाने और ठोस परीक्षण पुन: प्रयोज्य कार्यों के संदर्भ में) हैं; यह मामला एक अच्छा उदाहरण है (जो मुझे लगता है कि इस सवाल का जवाब दिया गया था)।
एलेक्स मार्टेली

7
का भी उपयोग कर सकते हैं: के (m+2)//3बजाय(m-1)//3 + 1
बेन

49

यदि आप पहले से ही उपयोग कर रहे हैं 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

क्या होगा अगर मेरा वित्तीय वर्ष की तिमाही सितंबर में शुरू होती है?
आर्थर डी। हावलैंड

पंडों की विधि pandas.Series.dt.quarterएक आदर्श समाधान है जब आपके पास डेटाफ्रेम या सीरीज ऑब्जेक्ट में डेटाइम मूल्य होते हैं ।
सुमंत लाजर

31

मैं एक और यकीनन क्लीनर समाधान सुझाऊंगा। यदि X एक datetime.datetime.now()उदाहरण है, तो तिमाही है:

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

छत को गणित मॉड्यूल से आयात करना पड़ता है क्योंकि इसे सीधे एक्सेस नहीं किया जा सकता है।


1
अब तक का सबसे अच्छा। अनेक अनेक धन्यवाद!
curlyreggie

3
संभवतः इसे एक इंट ()
पाब्लोइज

जैसे @garbanzio उत्तर बताता है। मैं नाव समारोह के माध्यम से महीने के तर्क डाल करने के लिए यह काम करने के लिए मिल की जरूरत है math.ceil(float(4)/3) = 2.0, जबकिmath.ceil(4/3) = 1.0
थियो Kouzelis

1
मुझे अनदेखा करो मुझे एहसास नहीं था कि .3 के बाद क्या किया। math.ceil(4/3.) = 2.0
Theo Kouzelis

11

वित्तीय वर्ष की तिमाही की कोशिश करने वाले किसी भी व्यक्ति के लिए , जो कैलेंडर वर्ष से भिन्न हो सकता है , मैंने ऐसा करने के लिए पायथन मॉड्यूल लिखा।

स्थापना सरल है। बस दौडो:

$ pip install fiscalyear

कोई निर्भरता नहीं हैं, और fiscalyearदोनों पायथन 2 और 3 के लिए काम करना चाहिए।

यह मूल रूप से अंतर्निहित डेटाटाइम मॉड्यूल के आसपास एक आवरण है , इसलिए 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)

fiscalyearGitHub और PyPI पर होस्ट किया गया है । दस्तावेज़ को डॉक्स पढ़ें पर पाया जा सकता है । यदि आप किसी भी ऐसी सुविधा की तलाश कर रहे हैं जो वर्तमान में नहीं है, तो मुझे बताएं!


4

यहाँ एक फ़ंक्शन का एक उदाहरण है जो एक 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

2

अगर mमहीने की संख्या है ...

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

2

यह विधि किसी भी मानचित्रण के लिए काम करती है:

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


1

यह एक पुराना सवाल है लेकिन फिर भी चर्चा के योग्य है।

उत्कृष्ट डेटटयूल मॉड्यूल का उपयोग करते हुए यहां मेरा समाधान है ।

  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का आखिरी दिन है (अगले तिमाही के पहले दिन, एक दिन घटाकर) की गणना की जाती है।


1

यह बहुत सरल है और अजगर 3 में काम करता है:

from datetime import datetime

# Get current date-time.
now = datetime.now()

# Determine which quarter of the year is now. Returns q1, q2, q3 or q4.
quarter_of_the_year = 'q'+str((now.month-1)//3+1)

0

हम्मम तो गणना गलत हो सकती है, यहां एक बेहतर संस्करण है (सिर्फ इसके लिए)

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]

@RussBradberry इस मामले में आप सही हो सकते हैं, लेकिन कभी-कभी पठनीयता और स्पष्ट गणना होने और कम त्रुटियों की ओर जाता है, बजाय एक उलटी गणना के
अनुराग उनियाल

1
@RussBradberry भी हटाए गए उत्तर और उस पर टिप्पणियों को देखें, एक साधारण गणना अच्छे प्रोग्रामर के लिए भी मुश्किल हो सकती है और इसे परीक्षण के अलावा शुद्धता को देखना मुश्किल है, मेरे समाधान में आप देख सकते हैं और सुनिश्चित करें कि यह काम करेगा
अनुराग उनियाल

1
जैसा आपने कहा "it is difficult to see correctness except by testing it"। आपको परीक्षण लिखना चाहिए, जैसा कि सभी अच्छे डेवलपर्स को होना चाहिए। टेस्ट वे हैं जो आपको गलतियाँ करने से रोकने में मदद करते हैं, और जो आप करते हैं उसे पकड़ते हैं। एक डेवलपर को खुद को गलती करने से रोकने के लिए प्रदर्शन और पठनीयता का त्याग नहीं करना चाहिए। इसके अलावा, यह कम से कम पठनीय है यदि आप शाब्दिक का उपयोग करके एक स्थिर तानाशाही करेंगे।
रोस ब्रैडबेरी

मुझे गलत मत समझो (m-1)//3 + 1यह सब पठनीय नहीं है, बहुत से लोग नहीं जानते कि क्या //करता है। मेरी मूल टिप्पणी सिर्फ उस बयान पर थी "calculations can go wrong"जिसके बारे में मुझे अजीब लगता है।
रोस ब्रैडबेरी

@RussBradberry वास्तव में मैं आपसे सहमत हूं मेरा जवाब एक विकल्प के रूप में था और कभी-कभी यह याद दिलाने के लिए कि मेरे पास बहुत से कोड हैं जहां लोग कुछ ऐसी चीजों की गणना / कटौती करने की कोशिश कर रहे हैं जो सिर्फ एक नक्शे में हार्डकोड किया जा सकता है
अनुराग उनालाल

0

यहाँ एक क्रिया है, लेकिन पठनीय समाधान भी है जो डेटाटाइम और दिनांक उदाहरणों के लिए काम करेगा

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

0

शब्दकोशों का उपयोग करके, आप इसे बंद कर सकते हैं

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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.