2016-02-16 17 views
6

Pythonを使用して半年ごとの日付の範囲を生成しようとしています。 Pandasは、これを助けるために関数pd.date_rangeを提供していますが、終了日から開始して後方に反復することができます。例えば終了日から開始日までのパンダdate_range

入力与える:

start = datetime.datetime(2016 ,2, 8) 
end = datetime.datetime(2018 , 6, 1) 
pd.date_range(start, end, freq='6m') 

結果は次のとおりです。

DatetimeIndex(['2016-02-29', '2016-08-31', '2017-02-28', '2017-08-31', 
       '2018-02-28']) 

どのように私は次のように生成することができます。

DatetimeIndex(['2016-02-08', '2016-06-01', '2016-12-01', '2017-06-01', 
       '2017-12-01', '2018-06-01']) 
+1

私の最初の解答を削除しました。ここの主なものはオフセットだと思いますよね? – Maximilian

+0

@Maximilianええ、それを置く別の方法です。 – pyCthon

答えて

4

次のような何かを行うことができます(あなたが作った編集から)更新された出力で:

from pandas.tseries.offsets import DateOffset 

end = datetime.datetime(2018 , 6, 1) 
start = datetime.datetime(2016 ,2, 8) 
#Get the range of months to cover 
months = (end.year - start.year)*12 + end.month - start.month 
#The frequency of periods 
period = 6 # in months 

pd.DatetimeIndex([end - DateOffset(months=e) for e in range(0, months, period)][::-1]).insert(0, start) 

これはかなり簡潔なソリューションであり、ランタイムを比較していないので、私はそれがどれほど速いか分からない。

これは基本的に、必要な日付をリストとして作成し、それをdatetimeインデックスに変換することです。

2

これは、パンダなしで、datutilを代わりに使用して行うことができます。しかし、それはおそらく必要以上に複雑です:

from datetime import date 
import math 
from dateutil.relativedelta import relativedelta 

#set up key dates 
start = date(2016 ,2, 8) 
end = date(2018 , 6, 1) 

#calculate date range and number of 6 month periods 
daterange = end-start 
periods = daterange.days *2//365 

#calculate next date in sequence and check for year roll-over 
next_date = date(start.year,math.ceil(start.month/6)*6,1) 
if next_date < start: next_date = date(next_date.year+1,next_date.month,1) 

#add the first two values to a list 
arr = [start.isoformat(),next_date.isoformat()] 

#calculate all subsequent dates using 'relativedelta' 
for i in range(periods): 
    next_date = next_date+ relativedelta(months=+6) 
    arr.append(next_date.isoformat()) 


#display results 
print(arr) 
+0

'TypeError:整数引数が必要ですが、' next_date = '行にfloatがあります。 – pyCthon

+0

@pyCons next_date行はそれですか?最初のものかforループのものか?後であれば、あなたはdateutilがインストールされていない可能性があります。 –

+0

最初のもの、dateutilがインストールされていますが、私は '' 2.4.2'' – pyCthon

関連する問題