0

Pandas 0.8.1 を使用して Yahoo の株価を取得しています

from datetime import datetime
from pandas.io.data import DataReader

stk_price = DataReader('600809.ss', 'yahoo', datetime(2006,1,1), datetime(2012,12,31)).reset_index()

>>> stk_price.Date
0    2010-01-04 00:00:00
1    2010-01-05 00:00:00
2    2010-01-06 00:00:00
3    2010-01-07 00:00:00
4    2010-01-08 00:00:00

そして、次の方法で日付を文字列に変換したい:

>>>stk_price.Date.astype('|S10')
0     1970-01-15
1     1970-01-15
2     1970-01-15
3     1970-01-15
4     1970-01-15
5     1970-01-15

「2010-01-04」などではなく「1970-01-15」と表示されるのはなぜですか? 修正方法は?

そして、私が持っている場合

DATE_LIST = [
 u'20090331', u'20090630', u'20090930', u'20091231', \
 u'20100331', u'20100630', u'20100930', u'20101231', \
 u'20110331', u'20110630', u'20110930', u'20111231', \
 u'20120331', u'20120630', u'20120930', u'20121231'
 ]

stk_priceDate 列の行を以下でフィルタリングしようとしDATE_LISTています。

from datetime import datetime
from pandas.io.data import DataReader
import numpy as np

DATE_LIST = [
 u'20090331', u'20090630', u'20090930', u'20091231', \
 u'20100331', u'20100630', u'20100930', u'20101231', \
 u'20110331', u'20110630', u'20110930', u'20111231', \
 u'20120331', u'20120630', u'20120930', u'20121231'
 ]

DATE_ARRAY = np.array(DATE_LIST,dtype='datetime64[us]')
stk_price = DataReader('600809.ss', 'yahoo', datetime(2006,1,1), datetime(2012,12,31)).reset_index()
rst = stk_price[stk_price.Date.isin(DATE_ARRAY)].Close

しかし、最初は空です。

それを修正する方法または Pandas 関数は結果をフィルタリングできますか?

4

2 に答える 2

2

df.Date=df.Date.apply(lambda x:x.date())日時列の変換に使用

>>> df=DataFrame({'Date':[datetime(2006,1,1)]})
>>> df
                  Date
0  2006-01-01 00:00:00
>>> df.Date=df.Date.apply(lambda x:x.date())
>>> df
         Date
0  2006-01-01

編集:

DATE_LISTをフォーマットする

dates=[datetime.datetime.strptime(i, "%Y%m%d").date() for i in DATE_LIST]

最後にisin、DATE_LIST にある行を除外するために使用します。

df[df['Dates'].isin(dates)]

一度に(Dateというdatecolumnを持つstk_priceデータフレームがあると仮定して):

import datetime

stk_price = DataReader('600809.ss', 'yahoo', datetime(2006,1,1), datetime(2012,12,31)).reset_index()
stk_price.Date=stk_price.Date.apply(lambda x:x.date())
dates=[datetime.datetime.strptime(i, "%Y%m%d").date() for i in DATE_LIST]
stk_price[stk_price['Dates'].isin(dates)]
于 2012-10-10T11:34:05.033 に答える
1

stk_price の日付を文字列に変換する代わりに (numpy のバグにより間違った日付が表示されます。github issue #1802も参照してください)、DATE_LIST をタイムスタンプに変換し、これらを直接使用して stk_price のインデックスを作成することもできます。以下は、ランダム データを含むフレームの例です。

In [16]: DATE_LIST = [
 u'20090331', u'20090630', u'20090930', u'20091231', \
 u'20100331', u'20100630', u'20100930', u'20101231', \
 u'20110331', u'20110630', u'20110930', u'20111231', \
 u'20120331', u'20120630', u'20120930', u'20121231'
 ]

In [17]: timestamps = [pd.Timestamp(date) for date in DATE_LIST]

In [18]: df = pd.DataFrame(np.random.randn(100,3), index=pd.date_range('20090331', periods=100))

In [19]: df.ix[timestamps].dropna()
Out[19]:
                   0         1         2
2009-03-31  0.520235  1.158889 -0.310227
2009-06-30  1.036449  0.528931 -0.083166
于 2012-10-10T11:53:26.387 に答える