无需Excel,如何将DDE数据导入Pandas DataFrame?
不借助Excel将DDE数据导入Pandas DataFrame
要直接从DARTSCRDE DDE服务器获取数据并导入Pandas DataFrame,无需经过Excel,可通过Python的DDE客户端库实现,以下是具体方案:
核心思路
直接与DARTSCRDE DDE服务器建立通信,按照你提供的DDE链接格式(=DARTSCRDE|{TOPIC}!'{ID}'),批量获取指定合约的字段数据,最后组装成DataFrame。
步骤实现
1. 依赖库安装
使用pywin32库提供的DDE客户端能力,先安装依赖:
pip install pywin32 pandas
2. 完整代码示例
import win32com.client import pandas as pd # 定义需要获取的合约信息:(合约代码, 交易所, DDE标识ID) contracts = [ ("NIFTY23JUN18500CE", "NSE", "2060225_0"), ("NIFTY23JUN18500PE", "NSE", "2060226_0") ] # 字段名与DDE主题的映射,对应你Excel中的列 field_mapping = { "LTP": "SYMBOL_TPRICE", "Qty.": "SYMBOL_VOLUME", "Chg": "SYMBOL_CHANGE", "% Chg": "SYMBOL_CHANGEPC", "Bid Qty": "SYMBOL_BIDQTY", "Bid": "SYMBOL_BID", "Ask": "SYMBOL_ASK", "Ask Qty": "SYMBOL_ASKQTY", "Total Bid": "SYMBOL_TOTBID", "Total Ask": "SYMBOL_TOTASK", "Open": "SYMBOL_OPEN", "P.Close": "SYMBOL_CLOSE", "Low": "SYMBOL_LOW", "High": "SYMBOL_HIGH", "T.Volume": "SYMBOL_TOTVOL", "Strike Price": "StrikePrice", "Exp. Date": "ExpDate" } # 存储所有合约数据的列表 data_records = [] for symbol, exchange, dde_id in contracts: # 初始化当前合约的基础数据 record = { "Symbol": symbol, "Name": "", # 示例中该字段为空,可根据实际补充 "XCH": exchange } # 遍历每个字段,从DDE服务器获取数据 for field_name, dde_topic in field_mapping.items(): try: # 建立DDE客户端连接并请求数据 dde_client = win32com.client.DDEClient("DARTSCRDE", dde_topic) raw_value = dde_client.Request(dde_id) # 尝试转换数据类型(数值型转成对应类型,非数值保持字符串) try: if "." in raw_value: record[field_name] = float(raw_value) else: record[field_name] = int(raw_value) except ValueError: record[field_name] = raw_value except Exception as e: print(f"获取{symbol}的{field_name}字段失败: {str(e)}") record[field_name] = None data_records.append(record) # 转换为Pandas DataFrame df = pd.DataFrame(data_records) # 按原始列顺序调整DataFrame列顺序 df = df[["Symbol", "Name", "XCH", "LTP", "Qty.", "Chg", "% Chg", "Bid Qty", "Bid", "Ask", "Ask Qty", "Total Bid", "Total Ask", "Open", "P.Close", "Low", "High", "T.Volume", "Strike Price", "Exp. Date"]] print(df)
关键注意事项
- 确保提供
DARTSCRDE服务的行情软件已启动,且DDE功能处于开启状态 - DDE是Windows专属协议,此方案仅适用于Windows环境
- 若
win32com.client.DDEClient调用报错,可尝试改用win32com.client.Dispatch实现更底层的DDE通信 - 数据类型转换逻辑可根据实际返回的数据格式调整(比如日期字段可能需要用
datetime解析)
内容的提问来源于stack exchange,提问作者albee gupta
相关产品推荐
相关产品推荐

