2016-07-22 7 views
4

S & P 500 ETF (新たに挿入されたデータをテストするためのspy30new)の30分データのPostgreSQLテーブルを作成しようとしています。 15分のデータを含む株式(すべて15)。 all15は 'dt'(タイムスタンプ)と 'instr'(株価記号)のインデックスを持ちます。私はspy30newに 'dt'のインデックスを持たせたいと思います。ValueError:DatetimeIndexをdtypeにキャストできません。datetime64 [us]

import numpy as np 
import pandas as pd 
from datetime import datetime, date, time, timedelta 
from dateutil import parser 
from sqlalchemy import create_engine 

# Query all15 
engine = create_engine('postgresql://user:[email protected]:5432/stocks') 
new15Df = (pd.read_sql_query("SELECT dt, o, h, l, c, v FROM all15 WHERE (instr = 'SPY') AND (date(dt) BETWEEN '2016-06-27' AND '2016-07-15');", engine)).sort_values('dt') 
# Correct for Time Zone. 
new15Df['dt'] = (new15Df['dt'].copy()).apply(lambda d: d + timedelta(hours=-4)) 

# spy0030Df contains the 15-minute data at 00 & 30 minute time points 
# spy1545Df contains the 15-minute data at 15 & 45 minute time points 
spy0030Df = (new15Df[new15Df['dt'].apply(lambda d: d.minute % 30) == 0]).reset_index(drop=True) 
spy1545Df = (new15Df[new15Df['dt'].apply(lambda d: d.minute % 30) == 15]).reset_index(drop=True) 

high = pd.concat([spy1545Df['h'], spy0030Df['h']], axis=1).max(axis=1) 
low = pd.concat([spy1545Df['l'], spy0030Df['l']], axis=1).min(axis=1) 
volume = spy1545Df['v'] + spy0030Df['v'] 

# spy30Df assembled and pushed to PostgreSQL as table spy30new 
spy30Df = pd.concat([spy0030Df['dt'], spy1545Df['o'], high, low, spy0030Df['c'], volume], ignore_index = True, axis=1) 
spy30Df.columns = ['d', 'o', 'h', 'l', 'c', 'v'] 
spy30Df.set_index(['dt'], inplace=True) 
spy30Df.to_sql('spy30new', engine, if_exists='append', index_label='dt') 

これはエラーなります「とValueErrorを:datetime64をDTYPEするDatetimeIndexをキャストすることはできません[たち]」
は、私がこれまで試したどのような(私が正常にパンダを使用してPGにCSVファイルをプッシュしている。しかし、ここでソースがあります。 PGデータベース):

  1. にインデックスを付けていない'dt'

    spy30Df.set_index([ 'DT']、インプレース= TRUE)#この行を削除 spy30Df.to_sqlは( 'spy30new'、エンジン、if_existsの= 'APPEND')#は、ケースpsycopg2に(datetime.datetimeの使用to_pydatetime()に型pandas.tslib.Timestampから 'DT' を変換index_labelオプション

  2. を削除しますPythonのDTで動作しますが、タイムスタンプをパンダない)

    datetime.utcfromtimestamp()

    timesAsDt = (spy0030Df['dt']).apply(lambda d: datetime.utcfromtimestamp(d.tolist()/1e9)) 
    
  3. を使用して
    u = (spy0030Df['dt']).tolist() 
    timesAsPyDt = np.asarray(map((lambda d: d.to_pydatetime()), u)) 
    spy30Df = pd.concat([spy1545Df['o'], high, low, spy0030Df['c'], volume], ignore_index = True, axis=1) 
    newArray = np.c_[timesAsPyDt, spy30Df.values] 
    colNames = ['dt', 'o', 'h', 'l', 'c', 'v'] 
    newDf = pd.DataFrame(newArray, columns=colNames) 
    newDf.set_index(['dt'], inplace=True) 
    newDf.to_sql('spy30new', engine, if_exists='append', index_label='dt') 
    
  4. することができます

  5. 各要素に対してpd.to_datetime()を使用pd.to_datetime()

    timesAsDt = pd.to_datetime(spy0030Df['dt']) 
    

答えて

4

働い使用。オプション4は動作しませんが、pd.to_datetime()をシリーズ全体に適用します。おそらく、Postgresドライバはpythonのdatetimeを認識しますが、datetime64は認識しません。オプション4は正しい出力を生成しましたが、PostgresにDFを送信するときにValueError(タイトルを参照)を取得しました

timesAsPyDt = (spy0030Df['dt']).apply(lambda d: pd.to_datetime(str(d))) 
関連する問題