निश्चित रूप से मैं इसे स्वयं लिख सकता था, लेकिन इससे पहले कि मैं पहिया को सुदृढ़ करूं क्या कोई फ़ंक्शन है जो पहले से ही ऐसा करता है?
pandas.Series.dt.quarter:।
निश्चित रूप से मैं इसे स्वयं लिख सकता था, लेकिन इससे पहले कि मैं पहिया को सुदृढ़ करूं क्या कोई फ़ंक्शन है जो पहले से ही ऐसा करता है?
pandas.Series.dt.quarter:।
जवाबों:
एक उदाहरण को देखते हुए 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मॉड्यूल) का उपयोग अपने (और अन्य) परियोजनाओं के लिए करता हूं, जिसमें बहुत कम है इन सभी कैलेंड्रिक अभिकलनों को पूरा करने के लिए कार्य - कुछ जटिल हैं, कुछ सरल हैं, लेकिन इस तरह के अभिकलन में कार्य को बार-बार (यहां तक कि सरल कार्य) या जोखिम कीड़े करने का कोई कारण नहीं है ;-)।
(m+2)//3बजाय(m-1)//3 + 1
यदि आप पहले से ही उपयोग कर रहे हैं 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एक आदर्श समाधान है जब आपके पास डेटाफ्रेम या सीरीज ऑब्जेक्ट में डेटाइम मूल्य होते हैं ।
मैं एक और यकीनन क्लीनर समाधान सुझाऊंगा। यदि X एक datetime.datetime.now()उदाहरण है, तो तिमाही है:
import math
Q=math.ceil(X.month/3.)
छत को गणित मॉड्यूल से आयात करना पड़ता है क्योंकि इसे सीधे एक्सेस नहीं किया जा सकता है।
math.ceil(float(4)/3) = 2.0, जबकिmath.ceil(4/3) = 1.0
.3 के बाद क्या किया। math.ceil(4/3.) = 2.0
वित्तीय वर्ष की तिमाही की कोशिश करने वाले किसी भी व्यक्ति के लिए , जो कैलेंडर वर्ष से भिन्न हो सकता है , मैंने ऐसा करने के लिए पायथन मॉड्यूल लिखा।
स्थापना सरल है। बस दौडो:
$ 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 पर होस्ट किया गया है । दस्तावेज़ को डॉक्स पढ़ें पर पाया जा सकता है । यदि आप किसी भी ऐसी सुविधा की तलाश कर रहे हैं जो वर्तमान में नहीं है, तो मुझे बताएं!
यहाँ एक फ़ंक्शन का एक उदाहरण है जो एक 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
यह विधि किसी भी मानचित्रण के लिए काम करती है:
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
उन लोगों के लिए, जो वित्तीय वर्ष तिमाही डेटा की तलाश कर रहे हैं, पांडा का उपयोग करते हुए,
import datetime
import pandas as pd
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
संदर्भ: पांडा अवधि सूचकांक
यह एक पुराना सवाल है लेकिन फिर भी चर्चा के योग्य है।
उत्कृष्ट डेटटयूल मॉड्यूल का उपयोग करते हुए यहां मेरा समाधान है ।
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का आखिरी दिन है (अगले तिमाही के पहले दिन, एक दिन घटाकर) की गणना की जाती है।
हम्मम तो गणना गलत हो सकती है, यहां एक बेहतर संस्करण है (सिर्फ इसके लिए)
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]
"it is difficult to see correctness except by testing it"। आपको परीक्षण लिखना चाहिए, जैसा कि सभी अच्छे डेवलपर्स को होना चाहिए। टेस्ट वे हैं जो आपको गलतियाँ करने से रोकने में मदद करते हैं, और जो आप करते हैं उसे पकड़ते हैं। एक डेवलपर को खुद को गलती करने से रोकने के लिए प्रदर्शन और पठनीयता का त्याग नहीं करना चाहिए। इसके अलावा, यह कम से कम पठनीय है यदि आप शाब्दिक का उपयोग करके एक स्थिर तानाशाही करेंगे।
(m-1)//3 + 1यह सब पठनीय नहीं है, बहुत से लोग नहीं जानते कि क्या //करता है। मेरी मूल टिप्पणी सिर्फ उस बयान पर थी "calculations can go wrong"जिसके बारे में मुझे अजीब लगता है।
यहाँ एक क्रिया है, लेकिन पठनीय समाधान भी है जो डेटाटाइम और दिनांक उदाहरणों के लिए काम करेगा
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