確かに私はこれを自分で書くことができますが、ホイールを再発明する前に、すでにこれを行う関数はありますか?
pandas.Series.dt.quarter
。
確かに私はこれを自分で書くことができますが、ホイールを再発明する前に、すでにこれを行う関数はありますか?
pandas.Series.dt.quarter
。
回答:
インスタンスを考えるx
のdatetime.date、(x.month-1)//3
など、第1四半期のあなたの第2四半期の1四半期(0を与えるだろう-あなたの代わりに1からカウントする;-)必要がある場合は、1を追加します。
もともと2つの答え、乗算upvotedとさえもともと受け入れが(両方とも現在は削除)、バギーだった-やっていない-1
分割前、およびので代わりに3の4で割る.month
12から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
ますが、私の(そして他の人の)プロジェクトを使用するための(十分にテストされた;-) モジュールを維持していることは確かです。これらのすべてのカレンドリック計算を実行する関数-一部は複雑、一部は単純ですが、そのような計算で何度も(単純な作業でさえ)作業を行ったりバグを危険にさらしたりする理由はありません;-)。
(m+2)//3
代わりに(m-1)//3 + 1
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
pandas.Series.dt.quarter
は、DataframeオブジェクトまたはSeriesオブジェクトのいずれかに日時値がある場合の理想的なソリューションです。
私は間違いなくよりクリーンなソリューションを提案します。Xがdatetime.datetime.now()
インスタンスの場合、四半期は次のようになります。
import math
Q=math.ceil(X.month/3.)
ceilは直接アクセスできないため、mathモジュールからインポートする必要があります。
math.ceil(float(4)/3) = 2.0
しばらくmath.ceil(4/3) = 1.0
.
3 の後に何をしたかわからなかった。math.ceil(4/3.) = 2.0
暦年とは異なる可能性がある会計年度の四半期を取得しようとしている人のために、これを行うための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)
fiscalyear
GitHubとPyPIでホストされています。ドキュメントはRead the Docsにあります。現在備えていない機能を探している場合は、お知らせください。
次に、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
パンダを使用して、会計年度の四半期データを探している人は、
import datetime
import pandas as pd
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
参照: パンダの期間インデックス
これは古い質問ですが、議論する価値があります。
これが優れた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日を引いて計算されます)。
うーん、計算がうまくいかない可能性があるので、これはより良いバージョンです(それのために)
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"
私に奇妙に聞こえるステートメントに関するものでした。