Skip to main content
 首页 » 编程设计

python之使用 pyodbc 使用唯一日期作为引用从 2 个表中提取数据

2025年05月04日9kuangbin

我有一个包含 2 个表的 MS Access 数据库;第一行包含显示“dd/mm/yyy”、“hh:mm”、“price”的行——每行显示下一增量分钟的数据。基本上,股票指数的盘中分钟价格数据。

第二个表包含以下数据; “dd/mm/yyy”、“收盘价”、“波动率”——例如使用“15.55”格式定价的波动率。每个额外的行显示下一个增量日的信息。

所以第一个表的行数在几分钟内增加,第二个表的行数在几天内增加。

我想形成一个 pyodbc 查询,根据日期从第二个表中提取数据并将其引用到第一个表。这样我就可以获得包含以下内容的数据行: “dd/mm/yy”,“hh:mm”,“价格”,“收盘价”,“波动率”。

然后“收盘价”和“波动率”值有望重复出现,直到分钟数进入第二天,然后它们将更新以显示第二天的值。

我对编程完全陌生,到目前为止已经成功完成了以下工作。我可以单独提取每个查询(并打印它们,这样我就知道我得到了什么)。

我知道下面的输出在日期之后包含一个额外的“00:00:00”——不是 100% 确定如何去掉它——而且我认为这无论如何都不重要,因为日期应该仍然是可以引用。 (一次一个问题!;))

表一的输出如下所示:

2005-01-03 00:00:00  17:00  1213.25 
2005-01-03 00:00:00  17:01  1213.25 
2005-01-03 00:00:00  17:02  1213.75 
2005-01-03 00:00:00  17:03  1213.75 

表 2 的输出如下所示:

2005-01-03 00:00:00  1206.25  14.08 
2005-01-04 00:00:00  1191.00  13.98 
2005-01-05 00:00:00  1183.25  14.09 
2005-01-06 00:00:00  1188.25  13.58 

到目前为止,这是我的代码:

from math import sqrt 
import time 
import pyodbc 
 
"""establishes connection to the database and creates "cursors" with which to query data""" 
 
ACCESS_DATABASE_FILE = "C:\\Python27\\Lib\\site-packages\\xy\\Apache         Python\\SandP.accdb" 
ODBC_CONN_STR = 'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s;' % ACCESS_DATABASE_FILE 
cnxn = pyodbc.connect(ODBC_CONN_STR) 
cursor1 = cnxn.cursor() 
cursor2 = cnxn.cursor() 
 
 
"""uses cursor1 to pull out distinct rows of data, ordered by distinct date/time""" 
 
cursor1.execute("select distinct [Intraday_values].[Date_], Time_, Close from [Intraday_values] order by [Intraday_values].[Date_]") 
row1 = cursor1.fetchall() 
for row1 in row1: 
print row1[0], row1[1], row1[2] 
time.sleep(2) 
 
"""uses cursor2 to pull out settlement prices and volatility data and order by distinct date""" 
 
cursor2.execute("select distinct [Closing_prices].[Date_], Last_price, Volatility from [Closing_prices] order by [Closing_prices].[Date_]") 
row2 = cursor2.fetchall() 
for row2 in row2: 
print row2[0], row2[1], row2[2] 
time.sleep(2) 

如有任何帮助或建议,我们将不胜感激,这可能会让我免于拔掉剩下的头发……

请您参考如下方法:

在我看来,您应该能够通过 JOIN 两个表的单个查询来做到这一点

cursor1.execute( 
    "select distinct iv.[Date_], iv.Time_, iv.Close, cp.Last_price, cp.Volatility " + 
    "from [Intraday_values] AS iv INNER JOIN [Closing_prices] AS cp" + 
    "    ON cp.[Date_] = iv.[Date_] " + 
    "order by iv.[Date_], iv.Time_") 
row1 = cursor1.fetchall() 
for row1 in row1: 
    print row1[0], row1[1], row1[2], row1[3], row1[4]