Ошибка «Объект отметки времени не имеет атрибута translate» - PullRequest
0 голосов
/ 23 апреля 2020

Недавно я начал работать над анализом цен на акции, чтобы оптимизировать свой портфель. Я начал с файла Excel и нескольких макросов VBA. Это работает довольно хорошо, но очень медленно. Итак, я сейчас пытаюсь ускорить и настроить правильную базу данных "цены на акции" на моем сервере ( на основе этого поста ).

В базе данных "stock_prices" есть таблица «daily_price», в которой хранятся дневные цены акций для некоторых тикеров. Для обновления таблицы «дневная цена» каждый день будет запускаться сценарий python, включающий следующие операторы Python / SQL.

df = pdr.get_data_yahoo(ticker, start_date)
for row in df.itertuples():
    values = [YAHOO_VENDOR_ID, ticker_index[ticker]] + list(row)
    cursor.execute("INSERT INTO daily_price (data_vendor_id, ticker_id, price_date, open_price, high_price, low_price, close_price, adj_close_price, volume) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)", tuple(values))

К сожалению, курсор «. строка execute ... »возвращает следующую ошибку:« AttributeError: у объекта «Timestamp» нет атрибута «translate» »*

Печать из кортежа« values ​​»: [1, 2, Timestamp (' 2004-08-19 00:00:00 '), 49.81328582763672, 51.83570861816406, 47.80083084106445, 49.9826545715332, 49.9826545715332, 44871300]

Основываясь на том, что я мог прочитать в другом аналогичном посте, я проверил тип индекса даты чтобы убедиться, что это не объект:

Print(df.index.dtype)

Это возвращает "datetime64 [ns]", что кажется хорошим.

Наконец, в базе данных я попытался изменить данные введите от «Дата» до «Дата / время», но это не решит ошибку.

Может кто-нибудь поделиться некоторыми советами о том, как решить эту ошибку?

С наилучшими пожеланиями,

Редактировать 25/04/2020: окончательное решение

            df = pdr.get_data_yahoo(ticker, start_date)
            df = df.reset_index()
            df.columns = ['price_date', 'open_price', 'high_price', 'low_price', 'close_price', 'adj_close_price', 'volume']
            df['data_vendor_id'] = YAHOO_VENDOR_ID
            df['ticker_id'] = ticker_index[ticker]
            df = df[['data_vendor_id','ticker_id','price_date', 'open_price', 'high_price', 'low_price', 'close_price', 'adj_close_price', 'volume']]
            df['price_date'] = df['price_date'].dt.strftime('%Y-%m-%d %H:%M:%S')
            print(df)
            cursor.executemany("INSERT INTO daily_price (data_vendor_id, ticker_id, price_date, open_price, high_price, low_price, close_price, adj_close_price, volume) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)", df.to_numpy().tolist())

1 Ответ

0 голосов
/ 23 апреля 2020

Рассмотрите возможность преобразования столбца даты и времени в строковое представление времени и используйте DataFrame.to_numpy() вместо подхода iterrows:

df = pdr.get_data_yahoo(ticker, start_date)

# ADD NEW COLUMNS
df["data_vendor_id"] = YAHOO_VENDOR_ID
df["ticker_id"] = ticker_index[ticker]]

# CONVERT DATE TO STRING TIME
df["DATE"] = df["DATE"].dt.strftime('%Y-%m-%d %H:%M:%S')


sql = '''INSERT INTO daily_price (data_vendor_id, ticker_id, price_date, 
                                  open_price, high_price, low_price, 
                                  close_price, adj_close_price, volume) 
         VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
      '''

# LIST
cursor.executemany(sql, df.to_numpy().tolist())
conn.commit()
...