5

私は Pandas を探索しています - それを学び、適用しようとしています。現在、次の構造の財務時系列データが入力された csv ファイルがあります。

date, time, open, high, low, close, volume 2003.04.08,12:00,1.06830,1.06960,1.06670,1.06690,446 2003.04.08,13:00,1.06700,1.06810,1.06570,1.06630,433 2003.04.08,14:00,1.06650,1.06810,1.06510,1.06670,473 2003.04.08,15:00,1.06670,1.06890,1.06630,1.06850,556 2003.04.08,16:00,1.06840,1.07050,1.06610,1.06680,615

ここで、csv データを pandas DataFrame オブジェクトに変換して、日付と時刻のフィールドがマージされ、次のように DataFrame の DateTimeIndex になるようにします。

df = pa.read_csv(path,
                 names = ['date', 'time', 'open', 'high', 'low', 'close', 'vol'],
                 parse_dates = {'dateTime': ['date', 'time']},  
                 index_col = 'dateTime')

これはうまく機能し、素敵な DataFrame オブジェクトを生成します。

<class 'pandas.core.frame.DataFrame'>
Index: 8676 entries, 2003.04.08 12:00 to nan nan
Data columns (total 5 columns):
open     8675  non-null values
high     8675  non-null values
low      8675  non-null values
close    8675  non-null values
vol      8675  non-null values
dtypes: float64(5)

しかし調べてみると、Index は DataTimeIndex ではなく、Unicode 文字列であることがわかりました。

type(df.index)
>>> pandas.core.index.Index
df.index
>>> Index([u'2003.04.08 12:00', u'2003.04.08 13:00', u'2003.04.08 14:00', ....

そのread_csvため、日付と時刻のフィールドを解析してマージしましたが、DateTimeIndex は作成しませんでした。私がドキュメントから理解している限りでは、datetime オブジェクトのリストとともに提供される新しいデータ構造オブジェクトは、DateTimeIndex を自動的に作成する必要があります。私が間違っている?DataFrame オブジェクトは例外ですか?

また、現在のインデックスを次のように変換しようとしました。

df.index = pa.to_datetime(df.index)

ただし、インデックスは変更されておらず、まだ Unicode 形式のままです。デフォルトの解析関数が機能していないのではないかと疑い始めましたが、エラー メッセージは表示されません。

この状況でDateFrameで機能するDateTimeIndexを取得するにはどうすればよいですか?

解決:

df = pa.read_csv(path,
                 names = ['date', 'time', 'open', 'high', 'low', 'close', 'vol'],
                 parse_dates={'datetime':['date','time']},
                 keep_date_col = True, 
                 index_col='datetime'
             )

ラムダ関数を適用して、パーサーが行うべきことを行います。

df['datetime'] = df.apply(lambda row: datetime.datetime.strptime(row['date']+ ':' + row['time'], '%Y.%m.%d:%H:%M'), axis=1)
4

1 に答える 1