অবশ্যই আমি নিজে এটি লিখতে পারতাম, তবে চাকাটি পুনর্নির্মাণের আগে এমন কোনও ফাংশন রয়েছে যা ইতিমধ্যে এটি করে?
pandas.Series.dt.quarter।
অবশ্যই আমি নিজে এটি লিখতে পারতাম, তবে চাকাটি পুনর্নির্মাণের আগে এমন কোনও ফাংশন রয়েছে যা ইতিমধ্যে এটি করে?
pandas.Series.dt.quarter।
উত্তর:
একটি দৃষ্টান্ত দেওয়া xএর datetime.date , (x.month-1)//3আপনি কোয়ার্টার (0 প্রথম ত্রৈমাসিকে দ্বিতীয় প্রান্তিকে, ইত্যাদি দেবে 1 - 1 যোগ করেন তাহলে আপনাকে ;-) পরিবর্তে 1 থেকে গণনা করতে হবে।
মূলত দুটি উত্তর, গুণিত উচ্চতর এবং এমনকি মূলত গৃহীত উভয়ই (বর্তমানে উভয় মুছে ফেলা হয়েছে) বগি ছিল - -1বিভাগের আগে করা হয়নি , এবং ৩ এর পরিবর্তে ৪ দ্বারা ভাগ করা হয়েছে, যেহেতু .month1 থেকে 12 পর্যন্ত চলেছে , তাই নিজের সূত্রটি কী তা পরীক্ষা করা সহজ easy ডানে:
for m in range(1, 13):
print m//4 + 1,
print
দেয় 1 1 1 2 2 2 2 3 3 3 3 4- দুই চার মাসের এক ভাগ এবং একক মাসের এক (epপ)।
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একটি আদর্শ সমাধান যখন আপনার কোনও ডেটাফ্রেম বা সিরিজ অবজেক্টে ডেটটাইম মান থাকে।
আমি আরও একটি বিতর্কিত ক্লিনার সমাধান প্রস্তাব করব। যদি এক্স 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)
fiscalyearগিটহাব এবং পিপিআইতে হোস্ট করা হয় । ডকুমেন্টেশন ডক্স পড়ুন পাওয়া যাবে । আপনি যদি বর্তমানে এমন কোনও বৈশিষ্ট্য সন্ধান করেন তবে তা আমাকে জানান!
এখানে এমন একটি ফাংশনের উদাহরণ রয়েছে যা একটি ডেটটাইম.ডেটটাইম অবজেক্ট পায় এবং প্রতি ত্রৈমাসিকের জন্য একটি অনন্য স্ট্রিং দেয়:
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