Files
sanguo_vnpy/archive/2026-04-29-cleanup/scripts/utils/import_from_csv.py
T
2026-04-29 20:15:43 +08:00

74 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python3
"""
从CSV导入数据到vnpy sqlite数据库
容器里pandas可以读csv,不需要额外依赖
"""
import pandas as pd
from vnpy.trader.object import BarData
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.database import get_database
from datetime import datetime
def main():
print("🚀 [IMPORT] 开始从CSV导入 510300.SSE 日线数据")
# 读取CSV
csv_file = "/tmp/510300_daily.csv"
df = pd.read_csv(csv_file)
# 转换trade_date为datetime
df['trade_date'] = pd.to_datetime(df['trade_date'])
print(f"✅ [IMPORT] 读取CSV完成,共 {len(df)}")
print(f" 时间范围: {df['trade_date'].min()} ~ {df['trade_date'].max()}")
# 转换为BarData
print(f"🔧 [IMPORT] 转换为 BarData...")
bars = []
for idx, row in df.iterrows():
# vnpy需要datetime对象,不是pandas Timestamp,并且处理时区问题
dt = row["trade_date"]
if hasattr(dt, 'to_pydatetime'):
dt = dt.to_pydatetime()
bar = BarData(
symbol="510300",
exchange=Exchange.SSE,
interval=Interval.DAILY,
datetime=dt,
open_price=row["open"],
high_price=row["high"],
low_price=row["low"],
close_price=row["close"],
volume=row["volume"],
turnover=row["amount"],
gateway_name="DATA"
)
bars.append(bar)
print(f"✅ [IMPORT] 转换完成,共 {len(bars)} 个BarData")
# 写入数据库
print(f"💾 [IMPORT] 写入数据库...")
db = get_database()
# 保存数据
db.save_bar_data(bars)
print(f"✅ [IMPORT] 保存完成,共写入 {len(bars)}")
# 验证
start_target = datetime(2021, 1, 1)
end_target = datetime(2026, 3, 1)
target_bars = db.load_bar_data("510300", Exchange.SSE, Interval.DAILY, start_target, end_target)
print(f"✅ [IMPORT] 验证目标区间 2021-01-01 ~ 2026-03-01: 找到 {len(target_bars)} 条数据")
if len(target_bars) > 0:
print(f" 第一条: {target_bars[0].datetime}")
print(f" 最后一条: {target_bars[-1].datetime}")
print(f" ✅ 满足需求!导入成功!")
print("\n🎉 [IMPORT] 导入完成!")
if __name__ == '__main__':
main()