From 9fe481f7a75f17653ba58588694bb3d52e69eb04 Mon Sep 17 00:00:00 2001 From: Lxy Date: Wed, 11 Mar 2026 10:42:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20/v1/stock/klines=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=B7=B2=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../amazingdata_adapter.cpython-311.pyc | Bin 30172 -> 31646 bytes app/adapters/amazingdata_adapter.py | 45 ++++++++++++------ app/models/__pycache__/types.cpython-311.pyc | Bin 21855 -> 21953 bytes app/models/types.py | 1 + 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/app/adapters/__pycache__/amazingdata_adapter.cpython-311.pyc b/app/adapters/__pycache__/amazingdata_adapter.cpython-311.pyc index faee356644abb60eac676654bc4c1b809ea01363..e44baea000b312913f9192484faa878d4fe03dc9 100644 GIT binary patch delta 3085 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 delta 1929 zcmZ{ke^69a6vy9vu*{OO!Vxu;dDb8yeok<59r?e?s944IA%&D}pW?Cj4|Io4S*;N_J-XEVm=iKi( z_uTu=zIShv%fFMD_f;x6$DZ?B#%y=j9gBIxz^6&XgNDCIBB69pHb`{19D0W2gYwZR zSeu_Q&&Z9C&Xx|IUH9mS+$D0D?C67hK3u>5CFqecq%`8tl%S#A*;4YXSkvMB5DdeR>Nr5g( z7v2SaOP=?iEe|KdodUg@3_t1B&-5syc+=st&!QhR!Uv{o`BTsc3YhS zor97HhJdPvx*S-_<25_nv=d{J9=przrOQx+FC!3Pw>q;_aHC|M#G_&Xu$8Xh@A2Z1 z(*30KVsh#}!*0XdIq&2Ixg?c(8nIJ4LPiR|kJb7UTK&!IkqNC6v2ByFZT{G{U=kOX zv@7Pdn7soRQ_`>L(kFF!W6B9#<)p51N@u#DGmZNubj_2xW~i=st2$#}|L*?L!3llQ zq`qiMUwJ`adAx5zUpuL<4Qdr>@zWf`O$4*z)Xa)g2N5CnRx;eH$d=GN*0@+-Sw+Yh zc;$(DB85v&R5LrZ%EbT8i9*$z5>f(pjJvdxOzB~x%B7{zeD*`97~qt#f|SC~D@zsU zG4?IO51FPk@(HXmtxpU@SzPu_4yPv|u{j0n3+&ch7J354OwIA1F>#iHHe${h#5ibb zG8BF^FCi|&vYHI(m(27ngmL3S5-pC@^zh`8c)RvINkq-8j;^C}5d>p25UkUX8j!5n zPW-U8Q6uhOQ$(2gU419%gQA8^)mf&^l7u(+LvMpXo)*7p_<-LWka@h+9h##mrlBVg zaj3rEYN)@h7=0O0$^LEunZ?YeK`>K#5@V+j;|u|rVD?(OY))^07rY(?3#H9G;d?A& z1$>#y9A=-*`K%Gn8slRgRO|8#I4uq_uK9Uh^)<_74X% zk_cjg>urk})$NVsC|KHi=9ySsYG-m!Btv(1_x<;_8uv?wy!LdmM~vRU^Q0D(9oeJ~ zCb|-!zN3tM4%<7*b!#xcp5b5lO%UiXkWWQv=Uz-b(6u;}+DtCP{O)pTI1PmE7IIEJ z(QU-m?pf*>R|_rtT>_(mFZN+?^g}#PJ7ilM$WP*c^%$=RU0!G?PQumtM0j*Ct#q86_O+x?tZ>xvq!o6!auw}ZEOdfCIPGdBO`vl( zF5SSQS@Q5e^`SzECp(BZgqS(93s>)-d#^i5YGFPb@bK75;I2zWs>C1Ny=3z_OvL%8 zING5pq~(~6GeehSY$aM!W(9b+5QsLKy=D_NvyULYX4-^^LR|}5Pa(PxW&|Fd+7Q?R z%|#u45W;t8Y#-E2Bn-fDHw&8j8i8BqtTLciOE3)T1rkH zv%@y55311PW`h#3#d|f9e~v)$z!u^Yj}IIm%dIj}6679Dzb<<^v~=@-1fiDy0s9IQ AGynhq diff --git a/app/adapters/amazingdata_adapter.py b/app/adapters/amazingdata_adapter.py index b62d363..8823e22 100644 --- a/app/adapters/amazingdata_adapter.py +++ b/app/adapters/amazingdata_adapter.py @@ -223,30 +223,45 @@ class AmazingDataAdapter(DataSourceAdapter): results = [] if symbol in kline_dict: df = kline_dict[symbol] + print(f"[amazingdata_adapter _fetch_klines_sync]DataFrame columns: {df.columns.tolist()}") + print(f"[amazingdata_adapter _fetch_klines_sync]DataFrame head:\n{df.head()}") + for _, row in df.iterrows(): - print(f"[amazingdata_adapter _fetch_klines_sync]正在处理行: {row}") - # 解析日期时间 - # if isinstance(row.name, pd.Timestamp): - # ts = int(row.name.timestamp()) - # trade_date = row.name.strftime('%Y-%m-%d') - # else: - # 假设是整数日期格式 YYYYMMDD - # date_str = str(row.name) - # dt = datetime.strptime(date_str, "%Y-%m-%d") - # ts = int(dt.timestamp()) - # trade_date = dt.strftime('%Y-%m-%d') - + # 从 kline_time 列获取日期(AmazingData 返回的日期字段) + kline_time = row.get('kline_time') + if pd.isna(kline_time) or kline_time is None: + print(f"[amazingdata_adapter _fetch_klines_sync]跳过无效日期: kline_time 为空") + continue + + try: + # kline_time 可能是 Timestamp 或整数 YYYYMMDD + if isinstance(kline_time, pd.Timestamp): + ts = int(kline_time.timestamp()) + trade_date = kline_time.strftime('%Y-%m-%d') + else: + # 整数格式 YYYYMMDD + date_str = str(int(kline_time)) + if len(date_str) != 8: + print(f"[amazingdata_adapter _fetch_klines_sync]跳过无效日期: {date_str}") + continue + + dt = datetime.strptime(date_str, "%Y%m%d") + ts = int(dt.timestamp()) + trade_date = dt.strftime('%Y-%m-%d') + except (ValueError, TypeError) as e: + print(f"[amazingdata_adapter _fetch_klines_sync]日期解析错误 '{kline_time}' (type: {type(kline_time)}): {e}") + continue + results.append(KLineData( symbol=symbol, - # time=ts, - time=datetime.fromtimestamp("2026-03-02").strftime('%Y-%m-%d'), + time=ts, open=float(row.get('open', 0)), high=float(row.get('high', 0)), low=float(row.get('low', 0)), close=float(row.get('close', 0)), volume=int(row.get('volume', 0)), amount=float(row.get('amount', 0)), - trade_date=row.get('kline_time').strftime('%Y-%m-%d') + trade_date=trade_date )) info(f"Fetched {len(results)} klines from AmazingData for {symbol}") diff --git a/app/models/__pycache__/types.cpython-311.pyc b/app/models/__pycache__/types.cpython-311.pyc index 2e299e91995227e63d535756f1c2a84571d33af0..3a22eac069272c8cf534b00cdbf0d42acc3f1c26 100644 GIT binary patch delta 1620 zcmZuve@q)?7{2dX&i*c?l+w=96_Cn`q!XQj6LAtCC?teLvZ<@UUAIbU<$CDcKe&x3 zAGzH97Y#OBcjP%gZ`n*#6+Ws-+QcZrMt^LdGCFm z?|Gl^yIcK)EX)w=C9BoMv1{e#XR%AO)_+ZWlMY7O!|+$F8`ABiPNQU!45DE#)9{?6 z7X{G>Q)cHA7S=Usy5_Y0BF}L%?Af>uSS8e0G#YDK4+}15gF&=uy7q#Vc6DX3M&p2h z#bq~$C7PZSdMr){&M4jN@}dilS)6u3a(Hql@pEAlJYIEWBIc$Gm$ z7fUE|KfVqi3?hgK5<-+gMn8~D#^po!ei$K!@EXSg%R^YEV5Hs&(Gpu(n*HW)Ywl&e zcS-Ms@bgu4vSd+bmtRDEAHseHpp<=V#zIyQMj_~~Grh^mj6NPqDUk5{O-GSIh{HSX zU&&EAQvL`rYkc6c=c7E69&amogP!ru@WMUY9`92oKp%uLdeZkD5pWEf81;wA1fBMe z=6kvWgDy=l)Sg8+0`CRFJ2p4ztuF_IO!wr7zqR+aA~rB~%}t+9#xa;0gVnAN2!Kcx=2i2{VX)VEj1lOYH+cX>4` zupwMPp&Q5 zmIw|=5TZu&gpiP^5E5h#{+KVy9~gswxtPT*#t^cYOq01HF$9cDFlgfY+}zeq-phUR zJkR%epC5PMjKS<@VE@!^w+j5gm21iPxczUdXqB*OLl$HldEU<%4*H}bRmQKk_@Nm4 z+I><9_s+EY%%!SBEyj@=H-6h*W_EH<#_<}r+=Px#tN-@S!gV@3HFYGXOf@ejVQO%W#%`=XaTwy8K$#4FebQ4)(wKu{-#kN7Lb9lWS~P_8tRM25PZcRG;UuWytOF;6YNA&4lEkK zKJ3BqXUZ_zEW;1@{2XEu<=DmErYt25GW>d{!Q86a@etD89vW^g@F&wI}PLfIZ ziAA5A6ibctvlKKDvRD@i!5oW+7GP=311&!IgB@#;L`dR^)*Z^?N2c@-33mv_o=Lpd z+5nGOdE4yr?Z@F-Fth3xa?3lGM0TyQfgq$qfLg%Cjz%=GbfxBTqa6Oz5rhiXxGe{z zi@%V