2017-09-16 14 views
1

私は2つのdatetimeインデックスを持っています.1つは、営業日のdate_rangeであり、もう1つは休日のリストです。2つの日時インデックスをフィルタリングする方法は?

休日のリストを開始日と終了日でフィルタリングします。しかし、今私はそれらに参加し、重複(休日と取引日の両方が存在する)を削除する必要があります。

最後に、daterangeを書式設定された文字列、つまりyyyy_mm_ddのリストに変換する必要があります。これを後で繰り返すことができます。ここで

は、これまでの私のコードです:

import datetime 
import pandas as pd 
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, \ 
    USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, \ 
    USLaborDay, USThanksgivingDay 

class USTradingCalendar(AbstractHolidayCalendar): 
    rules = [ 
     Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday), 
     USMartinLutherKingJr, 
     USPresidentsDay, 
     GoodFriday, 
     USMemorialDay, 
     Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday), 
     USLaborDay, 
     USThanksgivingDay, 
     Holiday('Christmas', month=12, day=25, observance=nearest_workday) 
    ] 

def get_trading_close_holidays(year): 
    inst = USTradingCalendar() 
    return inst.holidays(datetime.datetime(year-1, 12, 31), 
         datetime.datetime(year, 12, 31)) 

start_date = "2017_07_01" 
end_date = "2017_08_31" 

start_date = datetime.datetime.strptime(start_date,"%Y_%m_%d").date() 
end_date = datetime.datetime.strptime(end_date,"%Y_%m_%d").date() 

date_range = pd.bdate_range(start = start_date, end = end_date, name = 
          "trading_days") 
holidays = get_trading_close_holidays(start_date.year) 
holidays = holidays.where((holidays.date > start_date) & 
          (holidays.date < end_date)) 
holidays = holidays.dropna(how = 'any') 
date_range = date_range.where(~(date_range.trading_days.isin(holidays))) 
+0

タイトルは質問に質問しますが、投稿は問題を特定していません具体的な質問はしない。あなたは、ニーズを記述するだけです。エラーはありますか?望ましくない結果?希望の出力を表示してください。 – Parfait

+0

申し訳ありません - 私の最後のコード行はここではうまくいきません。私の質問はここ2倍です1)2つの日時インデックスを結合して重複を落とすようなベストプラクティス方法のために2)それらの日時オブジェクトを取得して文字列としてフォーマットする方法 – cifc

答えて

0

は、ブール条件によるフィルタリングを考えてみましょう:

date_range = date_range[date_range.date != holidays.date] 
print(date_range) # ONE HOLIDAY 2017-07-04 DOES NOT APPEAR 

# DatetimeIndex(['2017-07-03', '2017-07-05', '2017-07-06', '2017-07-07', 
#    '2017-07-10', '2017-07-11', '2017-07-12', '2017-07-13', 
#    '2017-07-14', '2017-07-17', '2017-07-18', '2017-07-19', 
#    '2017-07-20', '2017-07-21', '2017-07-24', '2017-07-25', 
#    '2017-07-26', '2017-07-27', '2017-07-28', '2017-07-31', 
#    '2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04', 
#    '2017-08-07', '2017-08-08', '2017-08-09', '2017-08-10', 
#    '2017-08-11', '2017-08-14', '2017-08-15', '2017-08-16', 
#    '2017-08-17', '2017-08-18', '2017-08-21', '2017-08-22', 
#    '2017-08-23', '2017-08-24', '2017-08-25', '2017-08-28', 
#    '2017-08-29', '2017-08-30', '2017-08-31'], 
#    dtype='datetime64[ns]', name='trading_days', freq=None) 

と文字列型の配列にdatetime型のインデックスを変換するastype()を使用して、でもtostring()リスト変換のために:

strdates = date_range.date.astype('str').tolist() 
print(strdates) 

# ['2017-07-03', '2017-07-05', '2017-07-06', '2017-07-07', '2017-07-10', 
# '2017-07-11', '2017-07-12', '2017-07-13', '2017-07-14', '2017-07-17', 
# '2017-07-18', '2017-07-19', '2017-07-20', '2017-07-21', '2017-07-24', 
# '2017-07-25', '2017-07-26', '2017-07-27', '2017-07-28', '2017-07-31', 
# '2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04', '2017-08-07', 
# '2017-08-08', '2017-08-09', '2017-08-10', '2017-08-11', '2017-08-14', 
# '2017-08-15', '2017-08-16', '2017-08-17', '2017-08-18', '2017-08-21', 
# '2017-08-22', '2017-08-23', '2017-08-24', '2017-08-25', '2017-08-28', 
# '2017-08-29', '2017-08-30', '2017-08-31'] 
+0

これはまさに私が探していたものでした〜のために助けをありがとう – cifc

+0

聞いてよかった!喜んで助けてください。 – Parfait

関連する問題