Запись даты из pandas_datareader в базу данных приводит к -1999

Я написал простое приложение на Python для чтения цен на акции из Google с помощью pandas_datareader и сохранения их в базе данных. Я нахожу странным, что когда я пишу набор данных, даты являются правильными, однако, когда я извлекаю дату и использую ее в операторе обновления, дата портится. Вот мой код (исключая операторы импорта и логику) и результаты:

df = webd.DataReader('WTB.L', 'google', dtStart, dtEnd)
print(df.head())
              Open High Low Close Volume
Дата                                              
2012-03-02 1687,0 1687,0 1672,0 1672,0  341944
2012-03-05  1666,0 1684,0 1660,0 1665,0 333824
lastPriceDateX = pd.to_datetime(df['Date'].tail(1).item())
lastPriceDateY = lastPriceDateX
lastPriceDate = lastPriceDateY.strftime('%d-%m-%Y').isoformat()
print('Last Price Date {}'.format(lastPriceDate))

Дата последней цены 21-03-2017

Выглядит хорошо, формат даты точно такой, как я хотел! Теперь я записываю дату в базу данных SQLITE: дата хранится как -1999

Набор данных записывается в базу данных SQLite, он имеет правильный формат даты:

"12667" "2017-03-16 00:00:00" "WTB.L" "3926.0" "3936.0" "3882.0" "3909.0" "441329"
"12668" "2017-03-17 00:00:00" "WTB.L" "3908.0" "3926.0" "3892.0" "3903.0" "642291"
"12669" "2017-03-20 00:00:00" "WTB.L" "3907.0" "3917.0" "3883.32" "3916.0" "175681"
"12670" "2017-03-21 00:00:00" "WTB.L" "3921.0" "3926.0" "3888.0" "3914.0" "315763"

Код для написания этого набора данных:

df.to_sql('tblStockPricesGoogle', conn,
          if_exists='append', index=False,
          index_label=None, chunksize=None, dtype=None)

Я мог бы написать функцию Python, чтобы взять последнюю дату из таблицы цен и записать ее до последней цены. Тем не менее, я хотел бы понять, почему эта дата печатается правильно, но она не записывает в базу данных правильно.

Спасибо всем большое.


Больше код:

#Gets data from google.
    try:
        print('Try')
        df = webd.DataReader('WTB.L', 'google', dtStart, dtEnd)
        print(df.head())
        df.insert(0,"Symbol", sy)

        df = df.reset_index()

        if df.empty :
            print('DataFrame is empty. There could be various issues. No updates.')

        else :
            print(df.head(1))
            print("Starting update:")

            #Call update function and pass dataframe.

            if sql3.saveDFtoSQL(df):
                #update table with last price, date, updated date etc.

                index is also returned.
                lastPrice = df['Close'].tail(1).item()
                lastPriceDateX = pd.to_datetime(df['Date'].tail(1).item())
                lastPriceDateY = lastPriceDateX
                lastPriceDate = lastPriceDateY.strftime('%d-%m-%Y')
                print("Updated {} prices, task done!".format(sy))
                print('Last  Price {}'.format(lastPrice))
                print('Last Price Date {}'.format(lastPriceDate))
                                    lastUpdate = dt.date(today.year,today.month,today.day).isoformat()
                print('LastUpdate attribute:',lastUpdate)
                sql3.updateListLastUp(sy,lastUpdate,lastPrice,lastPriceDate)


def updateListLastUp(symbol,date,lastPrice,lastPriceDate):  

    try:    
        strUpdate = 'UPDATE tblList SET lastUpdate="{}", LastPrice={},LastPriceDate={}, GetData=0 WHERE Ticker="{}"'.format(date,lastPrice,lastPriceDate,symbol)
        conn = sq3.connect(sql_file)
        conn.execute(strUpdate)
        conn.commit()
        return 'Done'

    except sq3.Error as er:

        print('Failure to update DataSet:', er)
        return er.tostring()

1 ответ

Решение

В:

strUpdate = 'UPDATE tblList SET lastUpdate="{}", LastPrice={},LastPriceDate={}, GetData=0 WHERE Ticker="{}"'.format(date,lastPrice,lastPriceDate,symbol)

Вы используете строковую интерполяцию (большая ошибка, так как она небезопасна, а также приводит к неожиданным результатам, если значения не экранированы должным образом), чтобы создать строку запроса, поэтому механизм БД видит "2017-03-15", который интерпретируется как 2017 - 3 - 15 и вычисляет значение, которое является 1999 и т. д.

Все ваши проблемы исчезнут, если вы используете параметры запроса, например:

strUpdate = 'update tblList set lastUpdate=?, lastPrice=?, lastPriceDate=?, GetData=0 where Ticker=?'
# ...
conn.execute(strUpdate, (date, lastPrice, lastPriceDate, symbol))
Другие вопросы по тегам