日付が年のどの四半期にあるかを判別するPython関数はありますか?


113

確かに私はこれを自分で書くことができますが、ホイールを再発明する前に、すでにこれを行う関数はありますか?


22
質問初期の回答が少し否定的であるように見えますが(「単なる問題」、「かなり単純なようです」)、非常に正当化された質問です。2つの回答(UPVOTEDを含む!)は非常にバグが多く、それほど単純ではない、または「ただ」...
Alex Martelli

彼が戻ってこれを修正すると確信しています
ナディアアラムリ

この質問は2018年に非常に役に立ちました:D
wdfc '14

日時オブジェクトがPandas SeriesまたはDataframeに格納されている場合、それぞれの四半期を返すメソッドがありますpandas.Series.dt.quarter
Sumanth Lazarus

回答:


161

インスタンスを考えるxdatetime.date(x.month-1)//3など、第1四半期のあなたの第2四半期の1四半期(0を与えるだろう-あなたの代わりに1からカウントする;-)必要がある場合は、1を追加します。


もともと2つの答え、乗算upvotedとさえもともと受け入れが(両方とも現在は削除)、バギーだった-やっていない-1分割前、およびので代わりに3の4で割る.month12から1になり、それはあなた自身のためにチェックするのは簡単ですが何であるかを式正しい:

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

与える1 1 1 2 2 2 2 3 3 3 3 4-2つの4か月の四半期と1か月の1つ(深い)。

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

与える1 1 1 2 2 2 3 3 3 4 4 4-これはあなたにとって非常に好ましいように見えませんか?-)

これは、質問が十分に正当化されていることを証明していると思います;-)。

datetimeモジュールに必要なすべての便利なカレンドリック関数がある必要はないと思いdatetoolsますが、私の(そして他の人の)プロジェクトを使用するための(十分にテストされた;-) モジュールを維持していることは確かです。これらのすべてのカレンドリック計算を実行する関数-一部は複雑、一部は単純ですが、そのような計算で何度も(単純な作業でさえ)作業を行ったりバグを危険にさらしたりする理由はありません;-)。


3
アレックス、ありがとう。これが関数があるべき理由です。何人の人がそれを間違えたか見てください。
Jason Christa

あなたはあなたの主張を証明したと思います。コメントを繰り返してページ全体を汚染する必要はありません。
ジョアン・シルバ

1
@ジェイソン、はい、そうです-他の誰かが私の賛成票を数えるために反対票を投じているようですが、他のバグのある回答(現在は削除済み)を確認したら、私はあなたの質問に賛成しました。
Alex Martelli、

1
@JG、「繰り返しコメント」とは?バグの多い回答が削除されたため、コメントが消えてしまったので、その内容を回答に取り入れました。簡単な計算でも、気を散らせたり急いだりして回避可能なバグを簡単に見つけられるようにすることが重要です。そして、それはプログラミングのベストプラクティスに(再利用可能な関数の作成と確実なテストに関して)影響を及ぼします。このケースは良い例です(質問が正当化されたことを証明すると思います)。
Alex Martelli、

7
次のものも使用できます:(m+2)//3代わりに(m-1)//3 + 1
Ben

49

IFすでに使用している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

会計四半期が9月に始まるとどうなりますか?
アーサーD.ハウランド

Pandasメソッドpandas.Series.dt.quarterは、DataframeオブジェクトまたはSeriesオブジェクトのいずれかに日時値がある場合の理想的なソリューションです。
Sumanth Lazarus

31

私は間違いなくよりクリーンなソリューションを提案します。Xがdatetime.datetime.now()インスタンスの場合、四半期は次のようになります。

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

ceilは直接アクセスできないため、mathモジュールからインポートする必要があります。


1
これまでで最高のもの。トンありがとう!
curlyreggie 2013年

3
おそらくこれをint()でラップする必要があります
Pablojim

@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 2017年

11

暦年とは異なる可能性がある会計年度の四半期を取得しようとしている人のために、これを行うためのPythonモジュールを作成しました。

インストールは簡単です。とにかく走れ:

$ pip install fiscalyear

依存関係はなくfiscalyear、Python 2と3の両方で動作するはずです。

基本的には、組み込みのdatetimeモジュールのラッパーであるため、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)

fiscalyearGitHubPyPIでホストされています。ドキュメントはRead the Docsにあります。現在備えていない機能を探している場合は、お知らせください。


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

これは古い質問ですが、議論する価値があります。

これが優れたdateutilモジュールを使用した私の解決策です。

  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日を引いて計算されます)。


1

これは非常にシンプルで、python3で機能します。

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は正しいかもしれませんが、簡潔な計算の代わりに、読みやすさと明示的なカウントであり、エラーが少なくなる場合があります
Anurag Uniyal

1
@RussBradberryも簡単な計算があまりにも良いプログラマのためのトリッキーなことができ参照、その上で削除された回答やコメントを参照し、あなたが見るとそれが動作することを確認することができます私の溶液中で、それをテストする以外に正しさを確認することは困難である
アヌラーグUniyal

1
あなたが言ったように"it is difficult to see correctness except by testing it"。すべての優れた開発者と同様に、テストを作成する必要があります。テストは、間違いを犯さないようにし、間違いを見つけるのに役立ちます。開発者は、自分たちが間違いを犯さないように、パフォーマンスと読みやすさを犠牲にするべきではありません。また、これは、リテラルを使用して静的な辞書を作成する場合よりも読みにくくなります。
Russ Bradberry 2013

誤解しないでください。(m-1)//3 + 1すべてが読みやすいわけでもありません//。私の最初のコメントはちょうど"calculations can go wrong"私に奇妙に聞こえるステートメントに関するものでした。
Russ Bradberry 2013

@RussBradberry実際に私はあなたの意見に同意します。私の答えは代替案であり、時々、他の選択肢があります。マップでハードコード化できる何かを人々が計算/推定しようとする多くのコードを見ました
Anurag Uniyal

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.