বছরের কোন ত্রৈমাসিকের তারিখটি নির্ধারণ করার জন্য কি পাইথন ফাংশন রয়েছে?


113

অবশ্যই আমি নিজে এটি লিখতে পারতাম, তবে চাকাটি পুনর্নির্মাণের আগে এমন কোনও ফাংশন রয়েছে যা ইতিমধ্যে এটি করে?


22
যদিও প্রথম দিকের উত্তরগুলি তাত্ক্ষণিকভাবে বরখাস্ত ("কেবল একটি বিষয়", "বেশ সহজ মনে হয়") বলে মনে হয় তবে খুব উত্তর দেওয়া হয়েছে: দুটি উত্তর (একটি আপত্তিকৃত একটি সহ!) ভয়াবহ বগিযুক্ত, এটি দেখায় যে এটি এতটা সহজ নয় বা " কেবল "...
অ্যালেক্স মার্টেলি

আমি নিশ্চিত যে সে ফিরে আসবে এবং এটি ঠিক করে
নেবে

এই প্রশ্নটি 2018 সালে খুব সহায়ক: D
wdfc

DATETIME বস্তু একটি সঞ্চিত হয় পান্ডাস সিরিজ অর Dataframe , একটি পদ্ধতি যা নিজ নিজ কোয়ার্টার (গুলি) ফেরৎ হল: pandas.Series.dt.quarter
সুমন্ত লাজার

উত্তর:


162

একটি দৃষ্টান্ত দেওয়া 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আমার (এবং অন্যদের) প্রকল্পগুলিতে কাজের জন্য একটি (সু-পরীক্ষিত ;-) মডিউল বজায় রেখেছি, যার অনেক কম রয়েছে এই সমস্ত ক্যালেন্ডারিক গণনা সম্পাদন করার জন্য ফাংশনগুলি - কিছু জটিল, কিছু সহজ, তবে কাজটি বেশি করে করার কোনও কারণ নেই (এমনকি সাধারণ কাজও) বা এই জাতীয় সংখ্যায় ঝুঁকি বাগ ;-)।


3
ধন্যবাদ অ্যালেক্স এই কারণেই একটি ফাংশন হওয়া উচিত। দেখুন কত লোক এটি ভুল করেছে।
জেসন ক্রিস্টা

আমি মনে করি আপনি আপনার বক্তব্য প্রমাণ করেছেন বারবার মন্তব্যে পুরো পৃষ্ঠাটিকে দূষিত করা অপ্রয়োজনীয়।
জোও সিলভা

1
@ জেসন, হ্যাঁ, ঠিক - এই কারণেই আমি যখন আপনার বগি উত্তরগুলি (বর্তমানে মুছে ফেলা) দেখেছি তখনই আমি আপনার প্রশ্নটিকে উজ্জীবিত করেছি, যদিও অন্য কেউ আমার উর্ধ্বতনকে গণনা করতে চেয়েছিল, আহা ভাল।
অ্যালেক্স মার্টেলি

1
@ জিজি, কী "বারবার মন্তব্য"? বগি উত্তরগুলি মুছে ফেলার সাথে সাথে মন্তব্যগুলি তাদের সাথে চলে গেল, তাই আমি তাদের লিখিত সামগ্রীগুলিকে উত্তরে এনেছি - এড়াতে বা তাড়াহুড়া করা কতটা সহজ তা সম্পর্কে সচেতন হওয়া গুরুত্বপূর্ণ এবং একটি সাধারণ গণনায় এমনকি একটি এড়ানো যায় এমন বাগ পাওয়া, এবং এর সর্বোত্তম-অনুশীলনের প্রোগ্রামিংয়ের পরিণতিগুলি (পুনরায় ব্যবহারযোগ্য ফাংশনগুলি তৈরি এবং দৃ and়ভাবে পরীক্ষা করার ক্ষেত্রে) রয়েছে; এই কেসটি একটি ভাল উদাহরণ (যা আমি মনে করি যে প্রশ্নটি প্রমাণিত হয়েছিল)।
অ্যালেক্স মার্টেলি

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

আমি আরও একটি বিতর্কিত ক্লিনার সমাধান প্রস্তাব করব। যদি এক্স datetime.datetime.now()উদাহরণস্বরূপ হয়, তবে ত্রৈমাসিকটি হ'ল:

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

সিলটি গণিত মডিউল থেকে আমদানি করতে হবে কারণ এটি সরাসরি অ্যাক্সেস করা যায় না।


1
এখন পর্যন্ত সেরা এক। অসংখ্য ধন্যবাদ!
কার্লিগ্রেগি

3
সম্ভবত এটি কোনও (
প্যাবলোজিম

@Garbanzio পছন্দ মত উত্তর। আমি ভাসা ফাংশন মাধ্যমে মাস যুক্তি করা এই কাজ পেতে প্রয়োজন math.ceil(float(4)/3) = 2.0যখনmath.ceil(4/3) = 1.0
থিও Kouzelis

1
আমাকে উপেক্ষা করুন আমি বুঝতে পারিনি .যে 3 এর পরে কী করেছে । math.ceil(4/3.) = 2.0
থিও কাউজেলিস

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)

fiscalyearগিটহাব এবং পিপিআইতে হোস্ট করা হয় । ডকুমেন্টেশন ডক্স পড়ুন পাওয়া যাবে । আপনি যদি বর্তমানে এমন কোনও বৈশিষ্ট্য সন্ধান করেন তবে তা আমাকে জানান!


4

এখানে এমন একটি ফাংশনের উদাহরণ রয়েছে যা একটি ডেটটাইম.ডেটটাইম অবজেক্ট পায় এবং প্রতি ত্রৈমাসিকের জন্য একটি অনন্য স্ট্রিং দেয়:

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

এই পদ্ধতিটি যে কোনও ম্যাপিংয়ের জন্য কাজ করে:

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]

@ রাস ব্র্যাডবেরি এক্ষেত্রে আপনার পক্ষে সঠিক হতে পারে তবে কখনও কখনও পঠনযোগ্যতা এবং স্পষ্টরূপে গণনা করা হয় এবং সংক্ষিপ্ত গণনার পরিবর্তে কম ত্রুটির দিকে পরিচালিত করে
অনুরাগ ইউনিয়াল

1
@ রুস ব্র্যাডবেরি এতে মুছে ফেলা উত্তর এবং মন্তব্যগুলিও দেখুন, দেখুন ভাল প্রোগ্রামারদের জন্য একটি সাধারণ গণনাও জটিল হতে পারে এবং এটি পরীক্ষা না করে যথাযথতা দেখা মুশকিল, আমার সমাধানে আপনি দেখতে পাবেন এবং নিশ্চিত হয়ে
উঠবেন

1
ঠিক যেমন তুমি বলেছিলে "it is difficult to see correctness except by testing it"। আপনার পরীক্ষা লেখার মতো হওয়া উচিত, যেমনটি সমস্ত ভাল বিকাশকারীদের উচিত। পরীক্ষাগুলি হ'ল ভুলগুলি করা থেকে বিরত রাখতে এবং আপনি যা করেন তা ধরতে সহায়তা করে। কোনও বিকাশকারীকে কোনও ভুল থেকে নিজেকে আটকাতে কখনই কর্মক্ষমতা এবং পাঠযোগ্যতার ত্যাগ করতে হবে না। এছাড়াও, আপনি যদি আক্ষরিক ব্যবহার করে কেবল একটি স্থির ডিক তৈরি করেন তবে এর চেয়ে কম পঠনযোগ্য।
রুশ ব্র্যাডবেরি

আমাকে ভুল করবেন না (m-1)//3 + 1যে সমস্ত পাঠযোগ্য হয় না, অনেকেই জানেন না কী //করেন। আমার আসল মন্তব্যটি কেবলমাত্র তার বিবৃতিতে ছিল "calculations can go wrong"যা আমার কাছে কেবল বেআইনী শোনায়।
রাশ ব্র্যাডবেরি

@ রাশব্রেডবেরি আসলে আমি আপনার সাথে একমত হই আমার উত্তরটি ছিল বিকল্প হিসাবে এবং কখনও কখনও মনে করার বিকল্প রয়েছে আমি অনেক কোড দেখেছি যেখানে লোকেরা কোনও মানচিত্রের মধ্যে হার্ডকোড করা যায় এমন কোনও কিছু গণনা / অনুদানের চেষ্টা করছে
অনুরাগ ইউনিিয়াল

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))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.