Переполнение DateTime с допустимой вставкой даты доступа - PullRequest
0 голосов
/ 17 января 2019

Всем, кто может помочь, спасибо. Я получаю очень странную ошибку при выполнении оператора INSERT с использованием pyodbc. Код ошибки:

cursor.execute(QueryInsert,params)
pyodbc.DataError: ('22008', '[22008] [Microsoft][ODBC Microsoft Access 
Driver]Datetime field overflow  (36) (SQLExecDirectW)')

Это происходит в соответствии с датой и временем 1986-03-28 00: 00: 00

Код, который я использую:

###Necessary Imports
from fredapi import Fred
import pyodbc
import datetime

###Connect to Access Database
conn = pyodbc.connect(r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" 
+r"DBQ=G:\Financial Modelling\Lease Database v1.0.accdb;")
cursor = conn.cursor()

###3M Libor
SourceCode = 'GBP3MTD156N'
fred = Fred(api_key='insert-api-key')
data = fred.get_series_all_releases(SourceCode)
A = data.shape[0]

###Cycle Through Results
for i in range(1,A):
    date1 = data.loc[i,'date']
    print(date1)
###execute query at date and only upload if empty
existquery = "SELECT * FROM EconVars WHERE SourceCode = '" + SourceCode + "' 
AND ValueDate = " + \
            "#"+str(date1.month)+"/"+str(date1.day)+"/"+str(date1.year)+"#"
cursor.execute(existquery)
existData = cursor.fetchall()

###check if empty
if len(existData) == 0:
    value1 = data.loc[i,'value']
    Description = '3M Libor'
    Source1 = 'Fred'
    params = (date1,value1,Description,Source1,SourceCode)
    QueryInsert = """INSERT into EconVars (ValueDate, ReportedValue, 
Description, Source,SourceCode)
            Values(?,?,?,?,?)"""
    cursor.execute(QueryInsert,params)
    cursor.commit()

###Commit Cursor for 3M LIBOR    
cursor.commit()
cursor.close()

Таблица в используемом мной файле доступа имеет 5 столбцов ValueDate определяется как дата / время (короткая дата) ReportedValue как число (двойной) Описание как краткий текст Источник в виде короткого текста SourceCode As Short Text

Кто-нибудь видел эту ошибку раньше или мог ее повторить?

Python 3.7.2 64-разрядный pyodbc 4.0.25 W10 64-разрядный и Office 365 64-разрядный

Спасибо всем, у кого есть идеи.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Вот пример того, как изменить ваше поле даты и времени на то, что OP говорит в своем ответе, который работал для меня (в пандах):

import pandas as pd

df = pd.DataFrame(['01/01/2019',None], columns=['datetime_field'])
df['datetime_field'] = pd.to_datetime(df['datetime_field'])

df['datetime_field'] = pd.to_datetime(df['datetime_field'], errors='coerce').where(df['datetime_field'].notnull(), 0.0)

Первоначально значения NULL в этом поле были NaT.

панд , где документы

0 голосов
/ 17 января 2019

Я выяснил, что проблема не в столбце даты и времени, предоставленном API.

Это действительно то, что сообщаемое значение, которое должно быть двойным, когда пропущено, на самом деле 'NaT', которое, я считаю, является пустым значением NULL или чем-то эквивалентным.

Доступ ожидает двойное значение.

...