2017-10-10 5 views
1

以下の短いスクリプトはDukascopyウェブサイトからデータを収集するのにfindatapyを使用しています。このパッケージはPandasを使用するため、Pandasを個別にインポートする必要はありません。Python:Pandasのデータフレームから特定の日付を選択

from findatapy.market import Market, MarketDataRequest, MarketDataGenerator 

market = Market(market_data_generator=MarketDataGenerator()) 
md_request = MarketDataRequest(start_date='08 Feb 2017', finish_date='09 Feb 2017', category='fx', fields=['bid', 'ask'], freq='tick', data_source='dukascopy', tickers=['EURUSD']) 

df = market.fetch_market(md_request) 

#Group everything by an hourly frequency. 
df=df.groupby(pd.TimeGrouper('1H')).head(1) 

#Deleting the milliseconds from the Dateframe 
df.index =df.index.map(lambda t: t.strftime('%Y-%m-%d %H:%M:%S')) 

#Computing Average between columns 1 and 2, and storing it in a new one. 
df['Avg'] = (df['EURUSD.bid'] + df['EURUSD.ask'])/2 

結果は次のようになります。この時点までは

enter image description here

、すべてが正常に動作しますが、私は、このデータフレームから特定の時間を抽出する必要があります。特定の時間(10:00:00 AM)にすべての値(入札、尋ねる、平均...またはそのうちの1つ)を選択したいと思います。

match_timestamp = "10:00:00" 
df.loc[(df.index.strftime("%H:%M:%S") == match_timestamp)] 

しかし、結果はというエラーメッセージです::他の postsを見て

は、私はこのような何かを行うことができると思った

AttributeError: 'Index' object has no attribute 'strftime'

私もdf.indexを実行することはできません.hour、それは、dtypeが 'Object'であることを前に、私がミリ秒(dtypeはdatetime64 [ns]まで)を削除する行の前で動作していました。 strftimeを使うためにこのフォーマットを逆にする必要があるように見えます。

お手伝いできますか?

答えて

2

をリセットしよう:

df = df.resample('H').first() # resample for each hour and use first value of hour 

その後:

df.loc[df.index.hour == 10] # index is still a date object, play with it 

あなたはそれを好まない場合は、あなただけで設定することができます次のようにdatetimeオブジェクトへのインデックス:

0 'のRangeIndex' オブジェクトには、属性 'のstrftime' がありません:
df.index = pd.to_datetime(df.index) 

そして、あなたのコードは

+0

私はミリ秒を取り除くことができ、データフレームの操作を通して同じdtypeにとどまることができるので、私はこれが好きでした。私はdf.loc [(df.index.strftime( "%H:%M:%S")== "10:00:00")]を使用することもできます。ありがとうございました! :) –

+1

@AquilesPáez問題はありません。また、大規模なセットでは、resample vs groupbyを使って約10%のスピードアップが得られます –

2

は、あなたがresampleを見てみなければならないインデックス

match_timestamp = "10:00:00" 
df = df.reset_index() 
df = df.assign(Date=pd.to_datetime(df.Date)) 
df.loc[(df.Date.strftime("%H:%M:%S") == match_timestamp)] 
+0

はAttributeErrorがあるとして動作するはずです。 reset_index()関数は、データフレームインデックスに必要なデータ型で満たされなければならないと思います。とにかく、私がdf = df.resample( 'H')。first()(親切に@ steven-gによって提案された)のtimegrouper行を変更すると、ソリューションの3行目がうまくいきます。そのコマンドはすでにそれを実行しているため、ミリ秒は削除されます。 –

+0

@AquilesPáezあなたはそれをdatetimeに最初に変換する必要があります – galaxyan

関連する問題